treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

コマンドライン(バッチファイル)でプリンタの表示名を変更する

プリンタの表示名を変更したいという要望から調べたことをご報告です。
今回はコマンドを使って実施する方法を調べました。

発端

プリンタの設置場所が変更になるので、プリンタの名称を設置場所に合わせて変更したい、という要望を受けました。

プリンタはWindowsで共有しておらず、各PCに個別にインストールして印刷を実行しています。
このため、単純に変更するだけなら、

このようにプリンタのプロパティを開いて新しいプリンタ名を入力すればいいのですが、インストール済のPC全台に対して手作業でプリンタ名を変更するのは現実的ではないという結論になりました。
また、プリンタには印刷設定が入っていることもあって、できれば印刷設定をそのまま維持した状態でプリンタの名称だけ変えたいという狙いもあります。

そこで、プリンタ名をコマンドから変更できないかを調べることになりました。

レジストリ変更

プリンタ名がレジストリに保持されていれば、それを変更すれば達成できるだろうと考えてレジストリを調べてみることにしました。

プリンタ名でレジストリを検索したところ、以下のキーを発見しました。

<HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers>

ここにプリンタが列挙されています。

このキーの箇所の「Name」キーと「Share Name」キーのプリンタ名を変更することでプリンタの表示名が変更できそうです。
しかし、他にも<HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers>配下のプリンタ名キーのさらに下に、「DsSpooler」キーがあり、その中にprinterNameキーも変更したほうが良さそうに見えました。スプーラと記載があるので、プリントスプーラの設定なのかなと。

Get-PrinterとRename-Printer

Microsoftのサイトでコマンドがないか探していたら、なんだかそのままやってくれそうなコマンドを発見しました。

■Get-Printer
https://learn.microsoft.com/en-us/powershell/module/printmanagement/get-printer?view=windowsserver2022-ps

■Rename-Printer
https://learn.microsoft.com/en-us/powershell/module/printmanagement/rename-printer?view=windowsserver2022-ps

これやりたいことそのままじゃあないかということで、もうちょっと詳しく動作を確認してみることに。

以下は「Get-Printer」のDescription(説明)の項にある説明文です。
--------------------------------------------------------------
説明
Get-Printer コマンドレットは、コンピューターにインストールされているプリンターの一覧を取得します。 Get-Printer を使用して 1 台のプリンターのプロパティを取得し、その情報を他のコマンドレットへの入力として使用することもできます。

Get-Printer ではワイルドカード文字を使用できます。 Windows PowerShell リモート セッションで Get-Printer を使用できます。

Get-Printer を実行するために管理者の資格情報は必要ありません。
--------------------------------------------------------------

「Rename-Printer」のDescription(説明)の項にある説明文です。
--------------------------------------------------------------
Rename-Printer コマンドレットは、コンピューター上の指定されたプリンターの名前を変更します。 名前を変更するプリンターを指定するには、Get-Printer コマンドレットで取得したプリンター オブジェクトを使用するか、プリンター名を指定します。

Rename-Printer ではワイルドカード文字を使用できません。 Windows PowerShell リモート セッションで Rename-Printer を使用できます。

Rename-Printer を実行するには、管理者の資格情報が必要です。
--------------------------------------------------------------

これを使ってバッチでプリンタ名変更をやってみようと思います。

バッチにしてみる

PowerShellなので、バッチファイルに記載するときは、<バッチファイルでPowerShellコマンド実行 - treedown’s Report>で実施したように、「PowerShell -command」を先頭にして、引数にPSコマンドを記載すればバッチファイルで実行可能です。

変更は、

Rename-Printer -Name '現在のプリンタ表示名' -NewName '変更後のプリンタ表示名'

で実行できるので、バッチでは

powershell -command Rename-Printer -Name '現在のプリンタ表示名' -NewName '変更後のプリンタ表示名'

と表記すれば、プリンタ表示名を変更するPowerShellコマンドが実行できます。

ここで、思ったのが、「名前変更対象のプリンタがOSに存在するかどうかを判定して、変更対象のプリンタが存在している時だけ実行しよう。」と考えました。

ここで使うのが、前出のGet-Printerコマンドレットです。

Get-PrinterでOSに導入されているプリンタの一覧表示ができますが、これをfind(findstr)で絞り込んで、変更対象のプリンタ表示名が存在するかどうかを確認します。
ただ、やってみた結果、findstrを使うと部分一致してしまったプリンタも引っ掛かってしまったので、findを使って完全一致するプリンタ表示名だけを対象とするようにしました。

powershell -command get-printer | find "変更対象のプリンタ名"

として、これをIF文で判定してやれば、プリンタの存在有無が確認できます。

一台変更バッチ

早速バッチファイルを作成しました。
※プリンタ名などは架空の名前です。

--------------------------------------------------------------
@echo off

powershell -command get-printer | find "5F-○○部 Printer-1"
if %ERRORLEVEL% == 0 goto SetRenum1
if %ERRORLEVEL% == 1 goto end

:SetRenum1
rem echo プリンタを発見しました。名称変更を実行します。
powershell -command Rename-Printer -Name '5F-○○部 Printer-1' -NewName '2F-▲▲部 Printer'

:end
--------------------------------------------------------------

「get-printer」とある行でプリンタの存在確認をし、発見した(=0)場合には、名前変更処理「:SetRenum1」ラベルに移動し名前変更処理、見つからなければ「:end」ラベルで終了します。
echoはremでコメントアウトしてありますが、判定が正常にできているかどうかを判定するため、使った行です。

これで正常動作が確認出来たとき、

「あ、二台あるから、もう一台の変更もよろしく。」

ん?二台あったの?

二台変更バッチ

対象の名前変更は二台のプリンタであることが後出しで判明、形はできていたので、二台変更バッチになるように処理を追加しました。

--------------------------------------------------------------
作成したバッチ
--------------------------------------------------------------
@echo off
rem 処理の概要
rem '5F-○○部 Printer-1'から'2F-▲▲部 Printer'に変更
rem '5F-○○部 Printer-2'から'3F-■■部 Printer'に変更

powershell -command get-printer | find "5F-○○部 Printer-1"

if %ERRORLEVEL% == 0 goto SetRenum1
if %ERRORLEVEL% == 1 goto NxtPrinter

:SetRenum1
rem echo プリンタを発見しました。名称変更を実行します。
powershell -command Rename-Printer -Name '5F-○○部 Printer-1' -NewName '2F-▲▲部 Printer'
goto NxtPrinter


:NxtPrinter
powershell -command get-printer | find "5F-○○部 Printer-2"
if %ERRORLEVEL% == 0 goto SetRenum2
if %ERRORLEVEL% == 1 goto end

:SetRenum2
rem echo プリンタを発見しました。名称変更を実行します。
powershell -command Rename-Printer -Name '5F-○○部 Printer-2' -NewName '3F-■■部 Printer'
goto end

:end

--------------------------------------------------------------

一台目の名前変更が完了したら、次のプリンタの判定と(発見できれば)名前変更を実行して、最終的に「:end」ラベルに移動するように追加しました。

一部、goto文が必要ないところもあるのですが、明示的に移動するために(うっかりを減らすために)いちおう入れています。

これで、対象のプリンタを発見し表示名変更を自動化できるように、権限代行の配布システムに設置して完了です。