とりあえず白黒指定
$printer = Get-WmiObject Win32_Printer | Where-Object Name -eq "***" # 印刷したいプリンタの名前
$printer.SetDefaultPrinter()
Set-PrintConfiguration $printer.name -Color $False
Start-Process "***" -Verb Print # 印刷したいファイルの名前
プリンタへの出力はOut-Printer
というコマンドレットもあるが、こちらはテキスト限定。幅広いファイルを処理するならPrint動詞に頼るのが良いと思われる。
その他の注意点
Set-PrintConfiguration -Color $False
がエラーになるプリンタがある
Microsoft Print To PDFなど。実在するプリンタにはないと信じたい・・・。
ただ、スクリプトで書く場合はエラーになっても落ちないような仕組みが必要になりそう。事前にプロパティの存在をチェックするとか。
Set-PrintConfiguration -Color $False
を無視するプリンタがある
試した限りではSend To OneNote 2016(デスクトップ版OneNoteに付属の仮想プリンタドライバ)が該当。
同じく実在するプリンタにそんなものはないと信じたい・・・。
Start-Processで、Print動詞がないファイルを指定してしまった場合は
For文で回している場合などうっかりPrint動詞がないファイル(icsとか)を指定しまう可能性は割とありそう。
これもエラーが起こったときに落ちないようにする必要がある。try, catchくらいしかやれることがないが。
そのほか実際に使う場合に必要になりそうなコマンド
事前に直前までデフォルト指定されていたプリンタを取得する
処理が終わったあと通常使うプリンタを戻すのに使う。
$default = Get-WmiObject Win32_Printer | Where-Object default
...
$default.SetDefaultPrinter()
あたりで。
そもそもそんなことしないでデフォルトプリンタで印刷すればいいのでは?
わたしもそう思っていた。しかし今のWindowsには、Microsoft Print To PDFやSend To OneNoteなど、仮想プリンタドライバとして振る舞うソフトがいくつか含まれている。
そのため、ユーザーが思っている「通常使うプリンタ」と、PCに設定されている「通常使うプリンタ」が異なっている ということはまああり得る。
また、今のWindowsには「Windowsで通常使うプリンターを管理する」という設定もあり、その確率は上がっていると思われる。なのでプリンタはちゃんと名前で指定しておくのがベター。