2016-08-03 13 views
2

Ich muss den Wert von WMIC COMPUTERSYSTEM GET MODEL/Value auf eine Variable setzen. Wenn ich diesen Befehl ausführe, erhalte ich die Ergebnisse unten. Warum bekomme ich die zusätzlichen Leerzeilen?Variable auf Wert des Befehls setzen

U:\>for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i 
:\>set output= 
:\>set output= 
:\>set output=Model=HP ProDesk 600 G1 SFF 
:\>set output= 
:\>set output= 
:\>set output= 
+0

@jeb, hielt ich die fehlenden Laufwerksbuchstaben 'U' in der Ausgabe als Copy-and-Paste-Fehler, dh Warum habe ich sie (hastig) (neu) eingefügt; die wahre Ausgabe auf der Konsole würde normalerweise auch leere Zeilen zwischen jedem benachbarten Echo enthalten; Jedenfalls habe ich das OP gebeten, uns die wahre Ausgabe zu zeigen ... – aschipfl

+0

@aschipfl Ich habe es vor dem Editieren getestet, da ich auch zuerst dachte, dass er einfach das 'U:>' verpasst habe, aber ich habe mich geirrt – jeb

+0

Ah, ja , @jeb, es scheint, dass jede Zeile mit einem Carriage-Return und einem Leerzeichen beendet wird ... – aschipfl

Antwort

2

Es ist ein Problem der WMIC-Ausgang, die carriage return Zeichen enthält.
Daher werden die leeren Zeilen nicht entfernt, da sie nicht vollständig leer sind.

der Schlitten zurückkehrt sind auch verantwortlich für den fremden Ausgang :> anstelle von U:>, da der Wagenrücklauf zuerst die Cursor auf POS1 bewegt und löscht dann ein Raum um die U.

Mit einem zusätzlichen FOR/F können Sie die Zeilenumbrüche Btw

for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do @(
    for /F "delims=" %X in ("%i") do set output=%X 
) 

abzustreifen. Normalerweise möchten Sie einen solchen Ausdruck in einer Batch-Datei, nicht in der Befehlszeile.
Dann müssen Sie es zu

@echo off 
for /f "delims=" %%i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do (
    for /F "delims=" %%X in ("%%i") do set output=%%X 
) 
+0

Um genauer zu sein, glaube ich, dass das Problem auf WMIC-Ausgabe in UTF-8 zurückzuführen ist, während interne Befehle ANSI erwarten. Viele Beiträge zu SO adressieren dieses Thema. Das heißt, @ Jebs Lösung funktioniert gut. – Filipus

+1

Ja, Sie haben Recht, die Ausgabe ist UTF-8, die das Wagenrücklaufproblem verursacht, da die Bytes '00 CR 00 LF' statt' CR LF' sind – jeb

0

Warum erhalte ich die zusätzliche Leerzeilen?

Da WMIC die leeren Zeilen in seiner Ausgabe druckt und "FOR /F processing of a text file consists of reading the file, one line of text at a time and then breaking the line up into individual items" (Hervorhebung von mir).

Auch wenn Sie keine Begrenzer definieren, wird jede Zeile noch einzeln verarbeitet.

Wenn Sie nicht brauchen, dass Model= in Ihrer Ausgabe, können Sie diese verwenden können:

for /f "delims== tokens=2" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i

+0

Ich habe versucht, 'do set output =% output %% i' und es setzt nicht den Wert Ich habe U: \ > echo% ausgang% % ausgang% U: \> echo% ausgang %% i % ausgang %% i –

+0

@JohnRing Das ist eine andere Frage, es hat nichts todo mit den leeren Zeilen, Sie sollten Ihre Frage ändern – jeb

0

Der wmic Befehl konvertieren erzeugt eine Unicode-Ausgabe, die for /F Probleme hat mit, so unerwünschte Artefakte bleiben. In der Tat sind das verwaiste Carriage-Return-Zeichen. Die beste und flexibelste Methode, um dies zu überwinden, besteht darin, eine weitere for /F-Schleife zu verschachteln, so dass die wmic-Ausgabe zweimal geparst wird.

Die folgende Befehlszeile direkt in die Konsole eingegeben wird, wird der entsprechende Ausgang auch gezeigt:

U:\>for /F "delims=" %I in ('wmic ComputerSystem GET Model /VALUE') do @for /F "delims=" %L in ("%I") do set "output=%L" 

U:\>set "output=Model=HP ProDesk 600 G1 SFF" 

U:\> 

Um die obige Befehlszeile in einer Batch-Datei zu verwenden, müssen Sie die Prozentzeichen verdoppeln:

:
@echo off 
for /F "delims=" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
    for /F "delims=" %%L in ("%%I") do set "output=%%L" 
) 
echo %output% 

um den Model= Präfix aus dem Wert der variablen output, ändert das Skript dieses abstreifen


Die Doppel-Parsing-Methode wird auf dbenham tatsächlich gutgeschrieben - WMIC and FOR /F : A fix for the trailing <CR> problem seine Antwort auf Why is the FOR /f loop in this batch script evaluating a blank line? und auch seine externen Artikel.

0

Wie andere schon erwähnt haben, liegt das Problem an der Unicode-Ausgabe von WMIC. In Ihrem Fall Sie noch alles auf einer einzigen Zeile mit dem folgenden Befehl halten:

for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value^|findstr /i "MODEL"') do @(set output=%i)