編集

編集

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

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 句全体を二重引用符で囲み、値に一重引用符を使用することもできます (これは、WMIC で FOR /F を使用する場合に 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

実際に脱出する必要があるとは思いません:が、それがどのように害を及ぼすとも思いません。

for /F で 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 ...

関連情報