2

変数内の文字列をバッチ内の実際の文字列と比較するのに苦労しています。スクリプトは次のとおりです。

 set failure=0
 for /F "usebackq delims=" %%L in (`"wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1"`) do (
 ::Quotes around variable seem to have no effect. Same result w/ or w/o them.
 if /I "%%L"=="No Instance(s) Available." set failure=1
 echo %failure%   %%L
 )

出力は次のとおりです。

ここに画像の説明を入力

if ステートメントが失敗するのはなぜですか? 値は明らかに一致します。助けてください!!

4

3 に答える 3

2

ここには 3 つの異なる落とし穴があります。

1) Wmic はCR、行末に文字列の一部となる余分な文字を追加することがあります。2)ブロック内のパーセント展開で
はアクセスできません。 3) 周りの引用符の欠落failure
%%L

これを試して

setlocal EnableDelayedExpansion
set failure=0
for /F "usebackq delims=" %%L in (`"wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1"`) do (
    set "line=%%L"
    set "head=!line:~0,9!"
    if "!head!"=="No Instan" set failure=1
    echo 123-%%L-456
)
echo %failure%
于 2013-10-09T14:52:54.413 に答える
1

多くの場合、文字列の前後にはさらに多くのテキストがあります (処理する必要のある cr がある場合でも)。Wmic は扱いにくい獣です。

別のテストを実行して、結果をパイプするfindfindstr、エラーレベルを設定することができます。次のようなもの - またはfind、テキストが見つかったときに 0 に設定されるエラーレベルを使用します。

wmic PRINTER where name='10.146.2.52 - HP Color LaserJet CP5225n' GET Name 2>&1 |find "No Instance" >nul && echo printer not detected

%%L をエコーするときに引用符で囲み、明らかな末尾のテキストがあるかどうかを確認します。

これは私がデバッグで得たもので、追加の CR/0D に加えて、適切な測定のためにいくつかのヌルが得られます。:)

0B48:0100  4E 6F 20 49 6E 73 74 61-6E 63 65 28 73 29 20 41   No Instance(s) A
0B48:0110  76 61 69 6C 61 62 6C 65-2E 0D 0D 0A 0D 00 0A 00   vailable........
于 2013-10-09T15:43:41.810 に答える