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 ...