Powershellでプリンタードライバーをインストール x86_x64共用版

残念なことに我が社のPCのOSは32bitと64bitがある。
両方で正常に動くプリンターインストールのスクリプトが必要だ。

プリンターの追加とポートの追加のスクリプトは32bit、64bit関係なく動く。

プリンタードライバーだけが、
32bitと64bitで別なので、
32bitOSか64bitOSかを自動的に判別して
該当するドライバーをインストールするスクリプトを作り出せばいい。

## 32bitか64bitかを判別するスクリプト

Windows10 Pro では、
Win32_OparatingSystemのOSArchitectureをGet-WmiObjectで呼び出せなくなった。
代わりに環境変数で判別することにする。

実際にPowershellの画面で下記のコードを試してみましょう。

```ps1:環境変数で判別
Get-Item Env:PROCESSOR_ARCHITECTURE
```

```ps1:64bitの場合
PS> Get-Item Env:PROCESSOR_ARCHITECTURE
Name                           Value
----                           -----
PROCESSOR_ARCHITECTURE         AMD64

```

```ps1:32bitの場合
PS> Get-Item Env:PROCESSOR_ARCHITECTURE

Name                           Value
----                           -----
PROCESSOR_ARCHITECTURE         x86
```




32bitと64bitを切り分けるとなると
if文で下記のようになるでしょう。

```ps1:判別
$arch=Get-Item Env:PROCESSOR_ARCHITECTURE
if($arch.Value -match "x86"){
  echo "32bit"
}else{
  echo "64bit"
}
```

```ps1:実行結果
PS> $arch=Get-Item Env:PROCESSOR_ARCHITECTURE
>> if($arch.Value -match "x86"){
>>   echo "32bit"
>> }else{
>>   echo "64bit"
>> }

64bit

PS> 
```


## ソースコード
32bitか64bitかの判別のソースと、プリンタードライバーインストールのソースを
組み合わせると下記のようになる。

少し高度にドライバーをインストールする関数を作って、

- 32bitの場合は32bitのプリンタードライバー
- 64bitの場合は64bitのプリンタードライバー

をインストールするようになっている。


```ps1:install-driver.ps1
# プリンタドライバーインストール関数
function install-driver{
    Param($Name="Canon LBP8720/8710 LIPSLX",$SupportPlatform="Windows NT x86",$Version="3",$DriverPath,$InfName)
    $PrinterDriverList=New-Object System.Management.ManagementClass("Win32_PrinterDriver")
    $PrinterDriver=$PrinterDriverList.CreateInstance()
    # プリンタードライバー名
    $PrinterDriver.Name=$Name
    # WIndows x64か Windows NT x86か
    $PrinterDriver.SupportedPlatform=$SupportPlatform
    # version 3 意味は win2k
    $PrinterDriver.Version=$Version
    # ドライバーのフォルダ
    $PrinterDriver.DriverPath=$DriverPath
    # INFファイルのあるパス
    $PrinterDriver.InfName=$InfName

    $PrinterDriverList.AddPrinterDriver($PrinterDriver)
    # Putするのに管理者権限が必要
    $PrinterDriverList.Put()
}

# 32bit or 64bit判別
$arch=Get-Item Env:PROCESSOR_ARCHITECTURE

if($arch.Value -match "x86"){
    echo "32bitです"
    install-driver `
        -SupportPlatform "Windows NT x86" `
        -DriverPath "Z:\Printer_Driver\Drivers\x86\Canon\new\LIPSLX\Driver" `
        -InfName "Z:\Printer_Driver\Drivers\x86\Canon\new\LIPSLX\Driver\CNLB0J.INF"
}else{
    echo "64bitです"
    install-driver `
        -SupportPlatform "Windows x64" `
        -DriverPath "Z:\Printer_Driver\Drivers\x64\Canon\new\LIPSLX\x64\Driver" `
        -InfName "Z:\Printer_Driver\Drivers\x64\Canon\new\LIPSLX\x64\Driver\CNLB0JA64.INF"
}﻿

```


1. [PowerShellでプリンターをインストール(概要)](http://qiita.com/arachan@github/items/801d8ef7b41edc452978) 
2. [PowerShellでプリンタードライバーをインストール](http://qiita.com/arachan@github/items/e5f72b2b4f2e44b0bd9f)
3. [PowerShellでプリンターポートの作成](http://qiita.com/arachan@github/items/c2f4f4f10bcd4b80f84e) 
4. [PowerShellでプリンターの作成](http://qiita.com/arachan@github/items/d630b5d06f878ecd0efa) 
5. Powershellでプリンタードライバーをインストール x86_x64共用版 <- イマココ

## 終わりに
PowerShellとWMIObjectのスクリプトは、
昔のコマンドプロンプトやvbsのファイルより読みやすい。

さらに、PowerShellはリモート実行が可能である。
Invoke-Command を使い複数のPCに一気にプリンターを
インストールといったこともできる。

PowerShellユーザーが少しでも増えてくれることを望んでおります。

## 参考文献
[ENVを確認する方法](http://win.just4fun.biz/PowerShell/PowerShell%E3%81%A7OS%E3%81%8C32bit%E3%81%AA%E3%81%AE%E3%81%8B64bit%E3%81%AA%E3%81%AE%E3%81%8B%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E8%AA%BF%E3%81%B9%E3%82%8B%E6%96%B9%E6%B3%95.html)
[Environment Variables](https://msdn.microsoft.com/en-us/library/aa384274.aspx)