Der Befehl, der von FOR / F ausgeführt wird, durchläuft ein zusätzliches Parsing, bei dem alle nicht in Anführungszeichen enthaltenen / unescaped-Tokenbegrenzer (cmd.exe) in Leerzeichen umgewandelt werden. So WHERE LocalPath="value"
wird
WHERE LocalPath "value"
.
Du kannst dem entkommen =
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
Oder Sie können die gesamte WHERE-Klausel in Anführungszeichen einschließen und dann einfache Anführungszeichen für den Wert verwenden (dies ist meine bevorzugte Methode, WHERE-Klauseln mit WMIC zu schreiben, wenn sie mit FOR / F verwendet werden.)
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
Ich glaube nicht, dass der :
Flucht wirklich entgangen werden muss, aber ich sehe auch nicht, wie er Schaden anrichten kann.
Das gleiche Problem kann auftreten, wenn Sie mehrere Werte mit WMIC in einem For / F auswählen - die nicht in Anführungszeichen gesetzten / nicht umschriebenen Kommas werden in Leerzeichen umgewandelt. In diesen Fällen ist das Zitieren jedoch keine Option - Sie müssen den Kommas entgehen.
So etwas wird nicht funktionieren:
for /f "delims=" %%A in ('wmic ...... get value1,value2,value3') do ...
Sie müssen den Kommas entkommen:
for /f "delims=" %%A in ('wmic ...... bet value1^,value2^,value3') do ...
BEARBEITEN
Tatsächlich gibt es einen Trick, der es Ihnen manchmal erlaubt, alle Fluchtwege vollständig zu eliminieren. Da der von FOR / F ausgeführte Befehl über CMD / C ausgeführt wird, können Sie die Tatsache ausnutzen, dass CMD / C doppelte Anführungszeichen entfernt.
So etwas wie das Folgende funktioniert auch ohne Flucht, solange das keyword
Zeichen keine Escapezeichen enthält (es wird während der ersten Parsing-Runde nicht zitiert).
for /f "delims=" %%A in ( '"wmic .... where this='x' and that='y' get value1,value2,value3 | find "keyword"' ) do ...