web-dev-qa-db-ja.com

変数の問題として出力されたバッチファイルWMICコマンド

WMICコマンドから出力を取得して変数として設定しようとしていますが、何らかの理由で機能しません。誰かが助けることができますか?これが私がやろうとしていることです

for /f "tokens=*" %q IN (' WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE LocalPath="C:\\users\\ABC1" GET Status ^| find /V "Status" ') do set pat= %q

私がしている何か問題がありますか?

1
NirmalKD

FOR/Fによって実行されるコマンドは、引用符で囲まれていない/エスケープされていないすべてのcmd.exeトークン区切り文字をスペースに変換する追加の解析を実行します。したがって、WHERE LocalPath="value"
WHERE LocalPath "value"

=をエスケープできます

for /f "tokens=*" %q IN (
  'WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE LocalPath^="C:\\users\\ABC1" GET Status ^| find /V "Status" '
) do set pat= %q

または、WHERE句全体を二重引用符で囲み、値に一重引用符を使用することもできます(これは、FOR/Fとともに使用する場合にWMICでWHERE句を記述するための私の推奨される方法です)

for /f "tokens=*" %q IN (
  'WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE "LocalPath='C:\\users\\ABC1'" GET Status ^| find /V "Status" '
) do set pat= %q

:を本当にエスケープする必要はないと思いますが、それがどのように害を及ぼす可能性があるのか​​もわかりません。

/ FのforでWMICを使用して複数の値を選択すると、同じ問題が発生する可能性があります。引用符で囲まれていない/エスケープされていないコンマはスペースに変換されます。ただし、これらの場合、引用符はオプションではありません。コンマをエスケープする必要があります。

このようなものは機能しません:

for /f "delims=" %%A in ('wmic ...... get value1,value2,value3') do ...

カンマをエスケープする必要があります。

for /f "delims=" %%A in ('wmic ...... bet value1^,value2^,value3') do ...

編集

実際には、すべてのエスケープを完全に排除できるトリックがあります。 FOR/Fによって実行されるコマンドはCMD/Cを介して実行されるため、CMD/Cが二重引用符で囲まれていることを取り除くという事実を利用できます。

したがって、keywordにエスケープが必要な文字がない限り、次のようなものはエスケープなしで機能します(最初の解析ラウンドでは引用されません)。

for /f "delims=" %%A in (
  '"wmic .... where this='x' and that='y' get value1,value2,value3 | find "keyword"'
) do ...
1
dbenham