Warum bewertet die FOR / f-Schleife in diesem Batch-Skript eine Leerzeile?

8

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.

    
Morinar 04.11.2011, 20:42
quelle

7 Antworten

5

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%     
jeb 05.11.2011, 07:54
quelle
11

Ich bin gerade über dieses Thema gekommen. Ich habe findstr / v verwendet, um leere Zeilen auszuschließen:

%Vor%     
dmitry 18.06.2014 15:06
quelle
4

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.

    
matt 04.11.2011 23:55
quelle
3

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.

    
dbenham 02.02.2013 04:59
quelle
0

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%     
flabdablet 19.05.2013 08:55
quelle
0

Führen Sie den folgenden Befehl aus:

%Vor%

Ausgabe wird sein:

%Vor%

Beachten Sie, dass es keine zusätzlichen Zeilen geben wird.

    
David Lang 12.06.2013 14:37
quelle
0

Fügen Sie ^| findstr . hinzu und Sie erhalten nur keine leeren Zeilen

%Vor%     
André Pires 11.01.2017 17:37
quelle

Tags und Links