Stapeldatei WMIC-Befehlsausgabe als Variablenausgabe

759
NirmalKD

Ich versuche, eine Ausgabe von einem WMIC-Befehl als Variable zu erhalten. Aus irgendeinem Grund funktioniert es nicht. Kann jemand helfen? Das versuche ich zu tun

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 

Gibt es etwas, was ich falsch mache?

1
C: \ Windows \ System32> for / F "tokens = *"% q in ('WMIC / node: Comp1 PATH win32_UserProfile WHERE LocalPath = "C: \\ Benutzer \\ ABC1" GET Status ^ | Find / V "Status" ') setze pro =% q Ungültiges Verb. NirmalKD vor 6 Jahren 0
Hat es geschafft, es mit diesem Befehl zum Laufen zu bringen NirmalKD vor 6 Jahren 0
C: \ Windows \ System32> for / F "tokens = *"% a IN ('WMIC / node: Comp1 PATH win32_UserProfile WHERE "LocalPath =' C: \\ Benutzer \\ ABC1 '" GET Status ^ | Find / V " Status "^ | Find / V" "') set prop =% a: \ Windows \ System32> set prop = 0: \ Windows \ System32> set prop = NirmalKD vor 6 Jahren 0
Jede Idee, wie ich alle Leerzeichen aus der Ausgabe dieses Befehls entfernen kann NirmalKD vor 6 Jahren 0
Ich habe es gegoogelt und festgestellt, dass die meisten Antworten etwas kompliziert sind. NirmalKD vor 6 Jahren 0
Können Sie mir den genauen Befehl innerhalb der `FOR`-Schleife nennen, die Sie verwenden, um das erwartete Ergebnis mit den Leerzeichen oder was auch immer zu erhalten? Pimp Juice IT vor 6 Jahren 0
for / F "tokens = *"% a IN ('WMIC / node: Comp1 PATH win32_UserProfile WHERE "LocalPath =' C: \\ Benutzer \\ ABC1 '" GET Status ^ | Find / V "Status" ^ | Find / V "" ') set prop =% a NirmalKD vor 6 Jahren 0
Hast du Daves Vorschlag, richtig für dich zu arbeiten? Erwägen Sie gegebenenfalls, seine Antwort zu akzeptieren, indem Sie das kleine graue Häkchen links oben in Daves Antwort markieren und grün anzeigen, um ihm und Ihnen etwas Anerkennung zu geben. Pimp Juice IT vor 6 Jahren 0

1 Antwort auf die Frage

1
dbenham

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 keywordZeichen 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 ... 
Lassen Sie mich Ihren Vorschlag ausprobieren. Danke NirmalKD vor 6 Jahren 0