2017-01-04 3 views
1

Ich habe mehrere Textdateien in einem Ordner. Ich möchte die letzte Zeile jeder Datei im Ordner mit dem Dateinamensmuster *.Config drucken und diese Zeilen in eine neue Textdatei umleiten.Batch-Skript zum Drucken der letzten Zeile vieler Dateien in einem Ordner mit einem Dateinamen Muster

Das folgende Skript funktioniert für 1 Textdatei. Aber im Moment mache ich eine für Schleife für mehrere Textdateien und %lastline% Drucke immer den gleichen Wert.

@echo off & setlocal EnableDelayedExpansion 

for /f %%i in ('dir /b *.Config') do (
    for /r "delims==" %%a in (%%i) do (
     set lastline=%%a 
     echo %lastline% is the last line of %%i >> vResult.txt 
    ) 
) 
+0

Die Variable 'lastline' wird nicht benötigt, wenn Sie' echo %% a'; Wenn Sie die Variable verwenden möchten, lesen Sie sie wie '! lastline!', um * verzögerte Erweiterung * zu verwenden (Sie haben sie nur aktiviert, aber '% lastline%' verwendet sie nicht). Ihr Code funktioniert übrigens auch nicht zum ersten Mal. Sie müssen entscheiden, ob Sie ['for /R'](http://ss64.com/nt/for_r.html) oder [' for /F'](http://ss64.com/nt/ verwenden möchten) for_f.html) ... – aschipfl

Antwort

1

verwenden Batch-Code zu erhalten in die Datei geschrieben vResult.txt in aktuellen Verzeichnis die letzte Zeile jeder * .config-Datei in dem aktuellen Verzeichnis:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
del vResult.txt 2>nul 
for %%I in (*.config) do (
    for /F "usebackq delims=" %%L in ("%%I") do set "LastLine=%%L" 
    echo !LastLine! is the last line of %%I>>vResult.txt 
) 
endlocal 

Erste Befehlserweiterungen wie für die zweite benötigt FOR Die Erweiterung der Befehlszeile und der verzögerten Umgebungsvariablen, die für das Widerhallen der letzten Zeile jeder Datei erforderlich sind, werden mit der zweiten Befehlszeile aktiviert. Befehlserweiterungen sind standardmäßig aktiviert, aber keine verzögerte Erweiterung.

Dann vielleicht eine bereits bestehende vResult.txt mit Unterdrückung der Fehlermeldung ausgegeben durch Befehl DELSTDERR durch sie zu Gerät NUL bei der Datei umleiten zu handhaben gelöscht löschen existiert nicht.

Der äußere FOR sucht nach *.config Dateien im aktuellen Verzeichnis mit ausgeblendetem Attribut nicht festgelegt. Es ist nicht notwendig, den Befehl DIR hier zu verwenden, außer dass auch versteckte * .config-Dateien gefunden werden müssen.

Die inneren FOR verarbeitet die Zeilen jeder * CONFIG-Datei durch die äußeren FOR-Schleife gefunden. Es ist im Allgemeinen ratsam, den Dateinamen in doppelte Anführungszeichen zu setzen und usebackq zu verwenden, um den doppelten Dateinamen als Dateiname und nicht als zu verarbeitende Zeichenfolge zu interpretieren, wenn eine * .config-Datei ein Leerzeichen enthält. delims= deaktiviert das Aufteilen jeder Zeile auf Leerzeichen/Tabs, um die gesamte Zeile zu erhalten.

Da die Umgebungsvariable LastLine innerhalb eines Befehlsblocks definiert/geändert wird, muss die verzögerte Erweiterung zu Beginn aktiviert werden, indem die Umgebungsvariable mit Ausrufezeichen anstelle von Prozentzeichen referenziert wird.

Alle Umgebungsvariablen mit Prozentzeichen des gesamten Befehlsblock verwiesen auf jeder Iteration des äußeren FÜR auszuführen sind bereits durch Windows-Befehlsinterpreter mit den aktuellen Wert der referenzierten Umgebungsvariable ersetzt vor äußeren FÜR Befehl ausgeführt wird. Dies führte zu Ihrem Batch-Code mit ECHO Kommandozeile zusätzlich in der falschen Schleife in Ersatz %lastline% durch nichts, bevor die äußere FOR das erste Mal ausgeführt wird.

Für eine Batch-Datei debuggen und sehen, was Windows-Befehlsinterpreter führt wirklich nach den Linien Befehl Vorverarbeitung und die Befehlsblöcke, entfernen oder @echo off Kommentar oder diese Linie @echo on ändern, eine Eingabeaufforderung öffnen und das Batch-Lauf Datei aus diesem Konsolenfenster heraus, indem Sie den Namen mit dem vollständigen Pfad in Anführungszeichen eingeben, nachdem Sie das aktuelle Verzeichnis in das Verzeichnis geändert haben, in dem die Batch-Datei funktionieren soll.

Ein Leerzeichen des Umleitungsoperators links >> wird auch ausgegeben, durch den Befehl ECHO und daher auch als Leerzeichen am Ende in die Textdatei geschrieben, die der Grund ist, warum das Leerzeichen links von >> hier entfernt wird. Das Leerzeichen rechts von >> würde ignoriert, ist aber hier auch entfernt.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • setlocal /?
  • set /?

Und auch die Microsoft-Artikel Using command redirection operators.

+0

Vielen Dank! Es funktioniert gut, genau das, was ich erreichen wollte! – VINA

+0

Warum lenkst du nicht einfach die ganze äußere 'for'-Schleife um, wie '>'? dies würde verhindern, dass die Datei 'vResult.txt' am Anfang gelöscht werden muss ... – aschipfl

+0

Das wäre auch möglich. Aber es hat einen Nachteil, den ich nicht mag. Wenn der äußere __FOR__ im aktuellen Verzeichnis keine * .config-Datei finden kann, wird die Datei 'vResult.txt' trotzdem im aktuellen Verzeichnis mit 0 Bytes angelegt. Ich mag es nicht erstellen eine Ausgabedatei mit 0 Bytes, wenn keine Datei gefunden werden konnte, zu verarbeiten. Eine 0-Byte-Datei verbraucht trotzdem einen Block im Dateisystem und verursacht einen nutzlosen Disk-Write auf SSD-Disketten, der leicht vermieden werden könnte. – Mofi

Verwandte Themen