Warum ist die FOR /f-Schleife, die in diesem batch-Skript die Auswertung eine leere Zeile?
Bin ich zu schreiben versucht, eine batch-Skript, erhält (unter anderem) eine Liste aller Laufwerke des Computers hat. Der basic-code sieht wie folgt aus:
REM Build the list of disk drives to monitor
SETLOCAL enabledelayedexpansion
FOR /f "skip=1 tokens=1 delims=:" %%a in ('"WMIC logicaldisk WHERE drivetype=3 GET deviceid"') do (
SET "DISK_DATABASES=!DISK_DATABASES!%%a|"
SET "DRIVES_TO_MONITOR=!DRIVES_TO_MONITOR!%%a:\\|"
)
Ich ziemlich offensichtlich bauen Sie zwei Listen mit verschiedenen Formaten für die spätere Verwendung. Wenn ich diesen Befehl ausgeführt, aber die Ausgabe die ich bekomme sieht ungefähr so aus:
C|D|E||
C:\\|D:\\|E:\\|:\\|
Nun, ich erwarte, dass die Hinterkante Rohr-in beiden Fällen-und ich kann das schaffen, aber ich bin wirklich verwirrt, warum gibt es einen extra Eintrag in es. Wenn ich das wmic
Befehl manuell kann ich sehen, dass es tatsächlich eine leere Zeile am Ende der Ausgabe, aber mein Verständnis ist, dass /f
wurde speziell soll, um leere Zeilen zu ignorieren.
Wenn ich wieder ECHO
an, wie es aussieht, die Letzte Zeile ist gerade in so einem carriage return/newline oder ähnliches. Gibt es eine Möglichkeit, das zu tun, was ich erwarte? Bin ich etwas fehlt? Ich habe versucht zu schreiben, eine if
Bedingung in der Schleife, um auszuschließen, dass diese Letzte Zeile, aber es war... funky und nie gearbeitet. Ich freue mich über jede/alle helfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Fall die Letzte iteration erzeugt nicht ein leeres Element, und Sie erhalten Ihre Ausgabe von
C|D|E||
nur mitecho %DISK_DATABASES%
,aber
echo !DISK_DATABASES!
Ausgabe||D|E|
??Das ist, weil das Letzte element ist eine einzelne
<CR>
Charakter.Und
<CR>
Zeichen werden direkt entfernt werden, nachdem die Prozent-expansion, aber nicht mit der verzögerten Erweiterung.Könnten Sie dies vermeiden, verwenden Sie das Prozent-Erweiterung, um Sie zu entfernen
<CR>
Zeichen auf eine Zeile in den ersten Platz... Oder vielleicht ist das das Ergebnis von dem, was @matt herausgefunden hat.Ich kam gerade über diesem Thema. Ich habe mit " findstr /v zum ausschließen von leeren Zeilen:
Laut http://ss64.com/nt/for_f.html
So scheint es, dass WMIC und nicht spielen schön zusammen.
Entdeckte ich eine effiziente und zuverlässige Methode, um Streifen die unerwünschte
<CR>
am Ende jeder Zeile. Keine temp-Datei, und kein ANRUF nötig.Ich nicht verstehen, den Mechanismus, wie die FOR /F wandelt die WMIC-unicode-Ausgabe in ASCII. In der Regel FÜR /F nicht Lesen kann unicode. Aber es funktioniert, jedes konvertierte Zeile endet mit
<CR><CR><LF>
. FOR /F bricht Zeilen auf jeder<LF>
, und dann, wenn das Letzte Zeichen in der Zeile ist<CR>
es Streifen, die Letzte<CR>
, in diesem Fall hinterlässt die unerwünschten<CR>
.Die Lösung ist einfach an der jede Zeile durch eine weitere FOR /F 🙂
Diese Methode ist zuverlässiger als die Verwendung von normalen expansion, weil Sie nicht haben, um über sorgen zu zitieren oder escaping von Sonderzeichen. Zum Beispiel, Die CALL-Methode, die verwendet normalen Erweiterung nicht verarbeiten kann einen string wie
"this & that" & the other
. Aber diese Methode hat auch kein problem mit so einem string.for/f
für diese, normalerweise fand ich dieses Verhalten ärgerlich, aber in diesem Fall ist es nützlich.Mein standard-idiom für den Umgang mit diesem schreiben die Ausgabe von WMIC, um eine temp-Datei, dann verwenden Sie TYP (reduziert UTF16-ASCII) zu ernähren, dass Sie sich in FÜR, wie diese:
Führen Sie den folgenden Befehl ein:
Ausgabe:
Beachten Sie, dass es gibt keine extra-Zeilen.
Hinzufügen
^| findstr .
und Sie erhalten nur die nicht leeren Zeilen