DOS-batch-FOR-Schleife mit FIND.exe ist stripping out leere Zeilen?
Diese DOS-batch-script entfernen der leeren Zeilen und zeigt nicht die leeren Zeilen in der Datei, obwohl ich mich mit dem TYPE.exe Befehl um die Datei zu konvertieren, um sicherzustellen, dass die Datei ASCII, so dass der Befehl "SUCHEN" ist kompatibel mit der Datei. Kann mir jemand sagen, wie man dieses Skript beinhalten leere Zeilen?
@ECHO off
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE.exe "build.properties" ^| FIND.exe /V ""`) DO (
ECHO --%%A--
)
pause
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das Verhalten der FOR /F - es nie wieder leere Zeilen. Die Arbeit um zu verwenden, FINDEN oder FINDSTR Präfix der Zeile mit der Zeilennummer. Wenn Sie garantieren können keine Zeilen beginnen mit die Nummer der Zeile, Trennzeichen, dann setzen Sie einfach das entsprechende Trennzeichen und halten Token 1* verwenden Sie jedoch nur den 2. token.
Ich lieber FINDSTR - es ist mehr zuverlässig. Zum Beispiel können lange Zeilen abschneiden - FINDSTR nicht so lange, wie es liest direkt aus einer Datei. FINDSTR nicht drop lange Zeilen beim Lesen von stdin per pipe oder Umleitung.
Wenn die Datei enthält Zeilen, die beginnen mit Trennzeichen, und dann müssen Sie bewahren die gesamte Zeile mit der Zeilennummer Präfix, und verwenden Sie dann suchen und ersetzen zum entfernen der Zeile Präfix. Sie wollen wahrscheinlich verzögerten expansion aus, wenn die übertragung der %%Ein, um eine Umgebungsvariable, sonst keine ! wird beschädigt. Aber später innerhalb der Schleife müssen Sie die verzögerte Erweiterung zu tun, das suchen und ersetzen.
Wenn Sie nicht brauchen, um über Konvertierung der Datei in ASCII -, dann ist es effizienter, fallen die pipe und lassen Sie zu FINDEN oder FINDSTR öffnen der Datei als argument angegeben wurde, oder über die Umleitung.
Es ist eine andere Arbeit, die rund um das komplett umgangen FOR /F während des lese-Prozesses. Es sieht seltsam aus, aber es ist effizienter. Es gibt keine Einschränkungen bei der Verwendung verzögert die expansion, aber es hat sich leider andere Einschränkungen.
1) Leitungen dürfen durch Kündigung beendet werden <CR><LF> (dies wird nicht ein problem sein, wenn du die TYP-Datei-Konvertierung)
2) Linien <= 1021 Byte lang (ohne die <CR><LF>)
3) das abschließende steuerzeichen werden entfernt aus jeder Zeile.
4) es muss aus einer Datei Lesen, können Sie nicht verwenden Sie ein Rohr. Also in Ihrem Fall müssen Sie mithilfe einer temp-Datei zu tun, den Ihre ASCII-Konvertierung.
ECHO.
. Gibt es obskure Situationen, in denenECHO.
ausfallen kann, in der Erwägung, dassECHO(
nie versagt. Der Punkt, der entweder der syntax ist zu ermöglichen die Ausgabe von einer Leerzeile.TYPE
Befehl, dann pipe es in derFIND
Befehl? Warum nicht halbieren, auf die Datei zugreifen und verwenden nurFOR
'sskip
- Befehl mit derFIND
Befehl etwa so:FOR /f "tokens=1* skip=2 delims=]" %%x in ('FIND x.txt /n /v ""') DO @IF "%y"=="" (ECHO.) else (ECHO %%y)
Dass die Daten nur von der Festplatte gelesen einmal.Schrieb ich ein sehr einfaches Programm, das dienen kann als Ersatz für
FIND
undFINDSTR
Befehle, wenn Sie für diesen Zweck verwendet. Mein Programm heißtPIPE.COM
und legen Sie einfach ein Leerzeichen in leeren Zeilen, so dass alle Linien können direkt verarbeitet werden, durchFOR
Befehl ohne weitere Anpassungen (solange die eingefügten Leerzeichen nicht kümmert). Hier ist es:BEARBEITEN: Nachtrag als Antwort auf neue Kommentar
Den code an :DefinePipe Unterprogramm erstellen 88 bytes-Programm namens pipe.com, dass im Grunde genommen ein Prozess äquivalent zu dieser pseudo-Batch-code:
Diese Weise werden leere Zeilen in der Eingabedatei geändert werden, indem Sie Zeilen mit einem Leerzeichen, so dass FÜR /F-Befehl nicht mehr weglassen, Sie. Dies funktioniert "solange die eingefügten Leerzeichen don 'T cares" als ich sagte in meiner Antwort.
Beachten Sie, dass die pipe.com Programm funktioniert nicht unter 64-bit Windows-Versionen.
Antonio
%pipe%
enthält den kompilierten code ein ausführbares Programm, obwohl). Wenn es Ihnen nichts ausmacht, könnten Sie uns erklären: was das C bedeutet inset /PC char=
und wie ¿dieses Linie nimmt nur einen char?; wo der Inhalt%NewLine%
definiert ist; dass dieecho
's nicht beitreten, das Zeichen/Leerzeichen, und einen abschließenden Zeilenumbruch auf%line%
; und schließlich, was die variable ist das, was alle einzelnen chars verbunden sind, auf ein in jeder ¿zweite? iteration. Auch kann ein 64-bit-version nicht erstellt werden?Ausgabe-Zeilen inklusive Leerzeilen
Hier ist eine Methode, die ich entwickelt habe, für meinen eigenen Gebrauch.
Speichern Sie den code als batch-Datei sagen, SHOWALL.BAT und übergeben Sie die Quelldatei als Kommandozeilen-parameter.
Ausgang umgeleitet werden kann, oder verrohrt.
BEISPIELE:
showall source.txt
showall source.txt >destination.txt
showall source.txt | FINDEN, die "string"
Kurios ist die Einbeziehung der " ^<' (Umleitung), im Gegensatz zu nur tun, die folgenden:
Durch weglassen der Umleitung, einer führenden Leerzeile ausgegeben.
]
Zeichen aus den Zeilen, undecho.
schlägt fehl, wenn eine Zeile existiert, wie\..\..\Windows\system32\calc.exe
]
Zeichen. Nur der erste, oder bis es erfüllt die*
.Dank dbenham, das funktioniert, obwohl es etwas anders als sein Vorschlag:
ECHO !ln!
druckenECHO is off
wenn die Zeile leer ist! Deshalb habe ichECHO(!ln!
Wie bereits in diese Antwort auf die obige Frage, es scheint nicht, dass Zeilen übersprungen werden standardmäßig mit
for /f
(mindestens)Windows XP
(Community - Bitte aktualisieren Sie diese Antwort durch die Prüfung der unter batch-Befehle auf Ihre version & service packWindows
).EDIT: Pro Jeb's Kommentar unten, es scheint, dass die
ping
Befehl, in mindestensWindows XP
istverursacht
for /f
zu produzieren<CR>
's statt leere Zeilen (Wenn jemand weiß nämlich, warum, würdees schätzen, wenn Sie aktualisieren könnte diese Antwort oder Kommentar).
Als workaround scheint es, dass die zweite Standard-Trennzeichen token (
<space>
/%%b
im Beispiel)liefert als
blank
, die arbeitete für meine situation zu beseitigen, die leeren Zeilen jeweils durch ein "Elternteil"if
bedingt auf dem zweiten token auf den start derfor /f
wie diese:Über den untenstehenden code:
.... das folgende ist, was ich sehe, auf Windows XP, Windows 7 und Windows 2008, als nur drei Versionen & service-packs von Windows habe ich jederzeit Zugang zu:
"Pinging"
und"Reply"
. Aber das bedeutet nicht, dass FÜR/F holt eine leere Zeile. Die Zeile enthält eine<CR>
Charakter, daher der cursor springt zurück auf die Linie Anfang und das erste Zitat ist überschrieben durch das Letzte Zitat, das ist alles. Der ping-Befehl unter XP ist einfach nur buggy<cr>
imif not "x%%a"=""
Aussage?CR
aufrufen Sie können eine Funktion wie:trimmer <LF> set "trim=%1"
dies funktioniert, da alleCR
entfernt werden, nachdem die Prozent-expansion-phase. Aber für mehr Fragen, Sie sollten öffnen Sie eine eigene Fragefor /f
ist nicht völlig ignorieren leere Zeilen, ich denke, es ist das entfernen derlf
, aber nicht diecr
auf Win XP. Ich bin nur umschließt es in Anführungszeichen, um zu sehen, was es ist, ausgeben.