1.なぜコマンドラインを用いるのか
会社内のプリンターを更改する際、
利用者の端末1つ1つからプリンタ情報を消していくのはとても面倒です。
そんな問題を抱えたときにいっぺんに削除する方法を
自分用ナレッジとして残します。
2.どのような動きをするのか
プリンタを削除する際に行うことは、以下になります。
①プリンタ自体の削除
②プリンタドライバの削除
これをパワーシェルで消していきます。
それぞれの情報はpowershellコマンドの下記コマンドでそれぞれ確認できます。
get-printer
get-printerdriver
単純に"remove-printer"と"remove-printerdriver"を組み合わせても実現可能かと思いましたが、
端末内のデバイス一覧にプリンタが残ったままになるので、以下コマンドを採用しました。
3.パワーシェルでどのように書いたか
1) 基本的な変数定義
このパワーシェルで定義が必要なのはプリンタ名・ドライバ名程度なので、
その内容を定義します。
あとは削除前の件数カウントの際に使う数値の"1"と、ログファイル用に使う日付データを定義しておきます。
$Printer="プリンタ名"
$Driver="ドライバ名"
$ReturnCheck=1
$ExecutionDate=Get-Date -Format "yyyyMMddHHmm"
2) ログの開始を定義
任意の出力先にログを出力していきます。
わかりやすいように日付を末尾に付けます。
Start-Transcript ログファイル名_$ExecutionDate.log
3)プリンター削除(判定部分)
削除前に判定を入れます。
Get-WmiObject Win32_Printerコマンドでは、端末内に入っているプリンタ一覧を出力できます。
その結果削除対象をが存在するならば(1以上ならば)削除するように分岐させます。
$ResultPrinter=@(Get-WmiObject Win32_Printer | Where-Object { $_.Name -eq $Printer }).count
4)プリンター削除(削除部分)
上記のcount結果で1件以上見つかった場合に処理します。
rundll32.exeとは、DLL関数を呼び出すために使用します。
この中のprintui.dllを使用するという意味になります。
更にprintui.dllの中でPrintUIEntryを使用します。
それぞれのオプションの意味は以下の通りです。
/dl ローカルプリンタを削除する
/n プリンタ名を指定する
if($ResultPrinter -ge $ReturnCheck){
rundll32 printui.dll,PrintUIEntry /dl /n $Printer
echo "該当プリンタ有り"
}else{
echo "該当プリンタ無し"
}
4)念のためのwait設定
検証していたら稀に"プリンタが使用中のため削除できない"というメッセージがあり、
失敗するケースがありました。
その対策としてwaitを仕込みます。
Start-Sleep -s 60
5)ドライバー削除
ここから先はプリンタと同じです。
使うコマンドはrundll32ではなく、普通にpowershellコマンドで削除します。
削除判定もプリンタと同様です。
$ResultDriver=@(get-printerdriver | Where-Object { $_.Name -eq $Driver }).count
if($ResultDriver -ge $ReturnCheck){
Remove-PrinterDriver -Name $Driver
echo "該当ドライバ有り"
}else{
echo "該当ドライバ無し"
}
6)ログストップ
最後にログ出力を止めます。
Stop-Transcript
総括
rundll32を使うという発想に至らなかったのが嵌りポイントでした。
ログ出力や途中のechoなどデバッグ感がありますが、そこは後々の課題になります。