Windows 7/8 [.1]では、管理者としてコマンドラインからプリンターとポートの情報を構成できます。次に例を示します。
cd /d %WINDIR%\System32\Printing_Admin_Scripts\en-US
prnmngr -s computer-01 -l
ログインした資格情報を使用して、computer-01
に接続されているプリンターを一覧表示します。これにより、プリンタポートを含む多くの出力行が生成されます。私の目標は、TCP/IPポートであると想定してプリンタポートを見つけ、prnport
コマンドを実行してそのポートのSNMPステータスを無効にすることです。以下は、2つの異なるプリンターの出力例です。USBであり、もう1つはTCP/IPプリンターです。
Server name
Printer name JMC-KMC224-BW
Share name
Driver name KONICA MINOLTA C364SeriesPCL
Port name IP_192.168.0.11
Comment
Location
Print processor KOAYTJ_P
Data type RAW
Parameters
Attributes 2628
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown
Server name
Printer name DYMO LabelWriter 400
Share name
Driver name DYMO LabelWriter 400
Port name USB001
Comment
Location
Print processor winprint
Data type RAW
Parameters
Attributes 2624
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown
(注:これはX-Yの問題ではありません。問題は製造元に知られており、SNMPを無効にすることが既知の解決策です。)
TCP/IPポートであるポート名を見つけて、それをprnport
コマンドに対して実行できる変数に配置するにはどうすればよいですか?
問題の1つは、ポートnameがフリーテキストであるということです。 IPアドレスであるとは限りません。プリンタを設定する人が名前をIP_
で始まるように明示的に設定していることが確実でない限り、それは保証されません。
可能であれば、PowerShellの使用をお勧めします。 Get-PrinterPort
およびSet-PrinterProperty
または多分Set-PrintConfiguration
コマンドレット( Win10ドキュメント 、 Win8ドキュメント 、 Win8.1ドキュメント )とても便利に見えます。残念ながら、それらは Windows8またはServer2012以降でのみ使用可能 です。現時点ではWindows7にしかアクセスできず、テストできません。
それができない場合は、最初にprnport
を経由するのではなく、prnmngr
を直接使用できます。 prnport -l
は「すべてのTCPポートを一覧表示」します。これをDavidと同様のスクリプトと組み合わせて使用すると、正しい結果が得られます。
注意:設定によっては、prnport
呼び出しをcscript %windir%\System32\Printing_Admin_Scripts\en-US\prnport.vbs
に置き換える必要がある場合があります。また、リージョンen-US
は変更される可能性があります。
for /f "tokens=1,2,*" %%a in ('prnport -s computer-01 -l ^| find "Port name"') do (
prnport -t -s computer-01 -r "%%c" -md
)
簡単な説明:
for
ループです。詳細については、for /?
を参照してください。Port name foo
行をループし、それらからfoo
を取得しています。tokens=1,2,*
を指定することにより、結果文字列をスペースでトークン化し、%%a
をPort
に、%%b
をname
に、%%c
をすべてに設定します。後(それがアスタリスクの意味です)。コンピューター名を別の変数として渡すことをお勧めします。
また、TCP/IPプリンターが存在しない場合は処理されないことに注意してください。ループ本体は実行されるべきではないので、何もしないと思います。
もう1つのオプションは、WMIを直接使用することです。これは、プリンター管理スクリプトが内部で行うことです。