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.
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