Ich versuche ein Batch-Skript zu schreiben, das (unter anderem) eine Liste aller Laufwerke des Computers enthält. Der Basiscode sieht ungefähr so aus:
%Vor%Ich erstelle offensichtlich zwei Listen mit leicht unterschiedlichen Formaten, die später verwendet werden können. Wenn ich das aber ausführe, sieht die Ausgabe, die ich bekomme, ungefähr so aus:
%Vor% Nun erwarte ich in beiden Fällen die Trailing-Pipe und das kann ich auch, aber ich bin wirklich verwirrt, warum es dort einen extra leeren Eintrag gibt. Wenn ich den wmic
-Befehl manuell ausführe, kann ich sehen, dass es am Ende der Ausgabe tatsächlich eine Leerzeile gibt, aber mein Verständnis ist, dass /f
speziell Leerzeilen ignorieren sollte.
Wenn ich ECHO
aktiviere, sieht es so aus, als ob diese letzte Zeile gerade als Wagenrücklauf / Zeilenumbruch oder ähnlich kommt. Gibt es eine Möglichkeit zu tun, was ich erwarte? Fehle ich etwas? Ich habe versucht, eine if
Bedingung in die Schleife zu schreiben, um diese letzte Zeile auszuschließen, aber es war ... funky und hat nie funktioniert. Ich schätze jede / alle Hilfe.
In diesem Fall erzeugt die letzte Iteration kein leeres Element und Sie erhalten Ihre Ausgabe von C|D|E||
nur mit echo %DISK_DATABASES%
,
aber echo !DISK_DATABASES!
gibt ||D|E|
?? aus
Das liegt daran, dass das letzte Element ein einzelnes <CR>
-Zeichen ist.
Und <CR>
-Zeichen werden direkt nach der prozentualen Expansion entfernt, aber nicht mit verzögerter Expansion.
Sie können dies vermeiden, indem Sie die Prozent-Erweiterung verwenden, um sie zu entfernen
%Vor%Nach Ссылка
Viele der neueren Befehle und Dienstprogramme (z. B. WMIC) geben Textdateien im Unicode-Format aus, diese können nicht mit dem FOR-Befehl gelesen werden, der ASCII erwartet. Um das Dateiformat zu konvertieren, verwenden Sie den Befehl TYPE.
So scheint es, dass WMIC und FOR nicht gut zusammen spielen.
Ich habe eine effizientere und zuverlässigere Methode gefunden, die unerwünschte <CR>
vom Ende jeder Zeile abzustreifen. Keine temporäre Datei und kein CALL benötigt.
Ich verstehe nicht, wie FOR / F die WMIC-Unicode-Ausgabe in ASCII umwandelt. Normalerweise kann FOR / F Unicode nicht lesen. Aber wie auch immer es funktioniert, endet jede konvertierte Zeile mit <CR><CR><LF>
. FOR / F bricht Zeilen bei jedem <LF>
ab, und wenn das letzte Zeichen in der Zeile <CR>
ist, wird die letzte <CR>
entfernt, in diesem Fall bleibt die unerwünschte <CR>
übrig.
Die Lösung besteht darin, einfach jede Zeile durch ein weiteres FOR / F zu führen: -)
%Vor% Diese Methode ist zuverlässiger als die normale Erweiterung, da Sie sich keine Gedanken über Sonderzeichen machen müssen. Die CALL-Methode, die die normale Erweiterung verwendet, kann beispielsweise keine Zeichenfolge wie "this & that" & the other
verarbeiten. Aber diese Methode hat kein Problem mit solch einer Zeichenfolge.
Mein Standard-Idiom für den Umgang damit ist, die Ausgabe von WMIC in eine temporäre Datei zu schreiben und dann TYPE (was UTF16 auf ASCII reduziert) zu verwenden, um das in FOR einzufügen, wie folgt:
%Vor%Führen Sie den folgenden Befehl aus:
%Vor%Ausgabe wird sein:
%Vor%Beachten Sie, dass es keine zusätzlichen Zeilen geben wird.
Fügen Sie ^| findstr .
hinzu und Sie erhalten nur keine leeren Zeilen
%Vor%
Tags und Links batch-file