2

WMIC を使用して、古いプリント サーバーから古いプリンターを削除しようとしています。

コマンドラインから以下の構文を使用すると機能します

WMIC PRINTER WHERE "SERVERNAME LIKE '%%OLDSERVERNAME%%'" DELETE

ヘルプデスクが「プリンターを追加するにはどうすればよいですか」という電話を受けないようにするために、プリンターを交換するか、更新することができるかどうかを確認するように求められました

SERVERNAME のプロパティを設定するために SET を使用していくつかのバリエーションを試しましたが、処理されているように見えますが、何も変化せず、GET を実行しても古い値が表示されます。

そのため、FOR /F ループを実行し、プリンターの名前 (sharename) を変数にラップしてから、別のコマンドを使用して、問題のあるプリンターが削除された後にプリンターを再作成できると考えました。

これが私のスクリプトです

@ECHO

ECHO Gathering Installed Printer Information...

FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO SET PRINTERNAME=%%A

ECHO %PRINTERNAME%

したがって、必要に応じて値を適切な変数にまとめて取得すると思うかもしれませんが、いいえ、エコーをオンにすると、変数がキャプチャされるとすぐにnullに戻されるようです

私の出力は次のようになります...

FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO SET PRINTERNAME=%%A

SET PRINTERNAME=nameofprinter

SET PRINTERNAME=

ECHO

ECHO is on.

文字列をダンプしているように見える理由について、いくつか考えてみたいと思います。

Powershell と VBScript も選択肢から外れているわけではありません。私は両方に精通していますが、これは可能であるように思えただけで、最初からやり直したくありません。

4

5 に答える 5

5

WMIC は 2 行を返します。1 行にはプリンター名があり、もう 1 行は空です。
これに対する解決策は、空の行をテストすることです。

ECHO Gathering Installed Printer Information...
FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO if not "%%A"=="" SET PRINTERNAME=%%A
ECHO %PRINTERNAME%
于 2012-10-20T14:02:27.113 に答える
1

最も安全で一般的な方法はfor /F、次のように別のループをネストすることです。

for /F "skip=1 usebackq delims=" %%A in (`
    wmic Printer where 'Servername like "%%printaz1%%"' get ShareName
`) do for /F "delims=" %%B in ("%%A") do set "PRINTERNAME=%%A"

問題は、wmicコマンドの Unicode 出力と、 による ANSI テキストへの不適切な変換ですfor /F。これにより、一部の孤立した復帰文字が残り、追加の行が空でないものとして表示されます。2 番目のfor /Fループは、これらの変換アーティファクトを取り除きます。

また、返されたアイテムが最初の空白で切り捨てられないように、tokens=1オプションをに置き換えました。delims=

ユーザーdbenhamによる次の関連する回答もご覧ください。

于 2017-02-13T07:59:59.827 に答える
0
@ECHO

ECHO Gathering Installed Printer Information...

FOR /F "tokens=1 skip=1" %%A IN ('WMIC PRINTER WHERE "Servername like "%%printaz1%%"" get sharename') DO (
  SET PRINTERNAME=%%A
  goto end
) 
:end
ECHO %PRINTERNAME%
于 2015-01-28T19:58:27.817 に答える