Es gibt mehrere Lösungen für diese Aufgabe.
Die erste verwendet eine verzögerte Erweiterung bei der Ausführung aller Zeilen der Batch-Datei, die ungerade und gerade Zeilen austauschen. Das heißt, es funktioniert nicht richtig für Zeilen mit einem Ausrufezeichen in der Zeile, weil !
aus Zeile entfernt wird.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "SourceFile=%USERPROFILE%\Desktop\TestFile.txt"
if not exist "%SourceFile%" goto EndBatch
set "TargetFile=%USERPROFILE%\Desktop\TestFile2.txt"
del "%TargetFile%" 2>nul
set "LineOdd="
for /F "usebackq delims=" %%I in ("%SourceFile%") do (
if not defined LineOdd (
set "LineOdd=%%I"
) else (
echo %%I>>"%TargetFile%"
echo !LineOdd!>>"%TargetFile%"
set "LineOdd="
)
)
if defined LineOdd echo !LineOdd!>>"%TargetFile%"
move /Y "%TargetFile%" "%SourceFile%"
:EndBatch
endlocal
Blank und Leerzeilen werden von FÜR übersprungen und damit in die Zieldatei fehlt. Und Zeilen, die mit einem Strichpunkt ;
beginnen, werden beim Lesen jeder Zeile von FOR ignoriert und deshalb auch in der Ausgabedatei fehlen. Diese Einschränkungen sollten hier jedoch nach Eingabebeispiel keine Rolle spielen.
die Grenzen der ersten Lösung konnte mit diesem Batch Code vermieden werden, was natürlich viel langsamer ist:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFile=%USERPROFILE%\Desktop\TestFile.txt"
if not exist "%SourceFile%" goto EndBatch
set "TargetFile=%USERPROFILE%\Desktop\TestFile2.txt"
del "%TargetFile%" 2>nul
set "LineOdd="
for /F "tokens=1* delims=:" %%H in ('%SystemRoot%\System32\findstr.exe /N /R "^" "%SourceFile%"') do (
if not defined LineOdd (
set "LineOdd=_%%I"
) else (
if "%%I" == "" (
echo/>>"%TargetFile%"
) else (
echo %%I>>"%TargetFile%"
)
setlocal EnableDelayedExpansion
if "!LineOdd!" == "_" (
echo/>>"%TargetFile%"
) else (
echo !LineOdd:~1!>>"%TargetFile%"
)
endlocal
set "LineOdd="
)
)
if defined LineOdd (
setlocal EnableDelayedExpansion
if "!LineOdd!" == "_" (
echo/>>"%TargetFile%"
) else (
echo !LineOdd:~1!>>"%TargetFile%"
)
endlocal
)
move /Y "%TargetFile%" "%SourceFile%"
:EndBatch
endlocal
Es wäre auch möglich, Hybrid-Batch-Datei JREPL.BAT von Dave Benham geschrieben zu verwenden:
call jrepl.bat "^(.*)\r\n(.*)\r\n" "$2\r\n$1\r\n" /M /X /F "%USERPROFILE%\Desktop\TestFile.txt" /O "%USERPROFILE%\Desktop\TestFile2.txt"
move /Y "%USERPROFILE%\Desktop\TestFile2.txt" "%USERPROFILE%\Desktop\TestFile.txt"
Die letzte Zeile der Datei muss einen DOS/Windows-Zeilenabschluss (Wagenrücklauf \ Zeilenvorschub und Zeilenvorschub \ n) haben, wenn bei Verwendung dieser Lösung eine gerade Zeile angezeigt wird.
Um die verwendeten Befehle/ausführbare Dateien/Batch-Dateien und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehlszeilen aus und lesen Sie alle Hilfeseiten für jeden Befehl/ausführbare Datei/Batch-Datei sorgfältig durch.
del /?
echo /?
endlocal /?
findstr.exe /?
for /?
goto /?
if /?
jrepl.bat /?
move /?
set /?
setlocal /?
Lesen Sie auch die Microsoft Artikel über Using Command Redirection Operators für eine Erklärung der 2>nul
und >>
.
Warum haben Ihre Dateipfade doppelte Backslashes? Jeder einzelne Dateipfad auf jedem PC, den ich jemals benutzt habe, hat einen einzelnen Backslash. – Compo
es ist meine Gewohnheit, es funktioniert – andybelous2
Es ist [falsch] (https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247 (v = vs.85) .aspx # Pfade), ändern deine schlechte Angewohnheit! – Compo