BEARBEITEN

BEARBEITEN

Ich versuche, eine Ausgabe eines WMIC-Befehls als Variable festzulegen. Aus irgendeinem Grund funktioniert das nicht. Kann mir jemand helfen? Das ist, was ich versuche 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

Mache ich etwas falsch?

Antwort1

Der mit FOR /F ausgeführte Befehl durchläuft eine zusätzliche Analyse, bei der alle nicht in Anführungszeichen/ohne Escapezeichen gesetzten Token-Trennzeichen von cmd.exe in Leerzeichen umgewandelt werden. So WHERE LocalPath="value"wird
WHERE LocalPath "value".

Sie können 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 doppelte Anführungszeichen einschließen und dann einfache Anführungszeichen für den Wert verwenden (das ist meine bevorzugte Art, 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 dem :wirklich entgangen werden muss, aber ich sehe auch nicht, wie es schaden könnte.

Dasselbe Problem kann auftreten, wenn Sie mit WMIC in einem for /F mehrere Werte auswählen - die nicht in Anführungszeichen gesetzten/nicht maskierten Kommas werden in Leerzeichen umgewandelt. In diesen Fällen sind Anführungszeichen jedoch keine Option - Sie müssen die Kommas maskieren.

So etwas wird nicht funktionieren:

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

Sie müssen die Kommas maskieren:

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

BEARBEITEN

Tatsächlich gibt es einen Trick, mit dem Sie manchmal alle Escape-Zeichen vollständig eliminieren können. Da der von FOR /F ausgeführte Befehl über CMD /C ausgeführt wird, können Sie sich die Tatsache zunutze machen, dass CMD /C die einschließenden Anführungszeichen entfernt.

So etwas wie das Folgende funktioniert also ohne Escapezeichen, solange es keywordkeine Zeichen enthält, die maskiert werden müssen (es wird während der ersten Analyserunde nicht in Anführungszeichen gesetzt).

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

verwandte Informationen