Gibt es einen Windows-Befehl zum Konvertieren von Zeilenenden einer Datei?
Wir haben einen test.bat
, den wir ausführen müssen, um unseren Server zu starten. Wir verwenden Perforce und müssen Unix-Zeilenenden in unserem Arbeitsbereich haben. Aus irgendeinem Grund dürfen wir die Zeilenenden in unseren Arbeitsbereichen nicht in Windows ändern. Der Server läuft jedoch unter Windows.
Jedes Mal, wenn ich die bat-Datei ausführen muss, öffne ich sie in Notepad ++ und wähle Bearbeiten → EOL-Konvertierung → Windows. Gibt es eine Möglichkeit, dies zu automatisieren, damit wir die Zeilenenden nicht jedes Mal manuell ändern müssen, wenn wir mit Perforce synchronisieren?
Danke im Voraus.
Dies kann tatsächlich sehr einfach mit dem more
-Befehl ausgeführt werden, der in Windows NT und höher enthalten ist. Um input_filename
, der UNIX EOL (End Of Line) \n
enthält, in output_filename
zu konvertieren, der Windows EOL \r\n
enthält, führen Sie einfach Folgendes aus:
TYPE input_filename | MORE /P > output_filename
Der Befehl more
verfügt über zusätzliche Formatierungsoptionen, die Sie möglicherweise nicht kennen. Führen Sie more/?
aus, um zu erfahren, was more
noch tun kann.
Sie können dies ohne zusätzliche Tools in VBScript tun:
Do Until WScript.StdIn.AtEndOfStream
WScript.StdOut.WriteLine WScript.StdIn.ReadLine
Loop
Füge die obigen Zeilen in eine Datei unix2dos.vbs
ein und führe es so aus:
cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt
oder so:
type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt
Sie können dies auch in PowerShell tun:
(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" |
Set-Content "C:\path\to\output.txt"
was noch weiter vereinfacht werden könnte:
(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt"
Die obige Anweisung funktioniert ohne explizite Ersetzung, da Get-Content
Eingabedateien bei jeder Art von Zeilenumbruch (CR, LF und CR-LF) implizit aufteilt und Set-Content
das Eingabearray mit Windows-Zeilenumbrüchen (CR-LF) verbindet, bevor es in eine Zeile geschrieben wird Datei.
Windows 'MORE' ist nicht zuverlässig, es zerstört TABs unweigerlich und fügt Zeilen hinzu.
unix2dos gehört auch zu MinGW/MSYS, Cygutils, GnuWin32 und anderen binären Unix-Port-Sammlungen - und kann bereits installiert sein.
Wenn Python vorhanden ist, konvertiert dieser One-Liner alle Zeilenenden in die aktuelle Plattform - auf einer beliebigen Plattform:
TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT
oder
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT
Oder fügen Sie den One-Liner in ein .bat/Shell-Skript und auf den PATH entsprechend Ihrer Plattform ein:
@REM This is any2here.bat
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1
und benutze das Tool gerne
any2here UNIXFILE.EXT > MYPLATFILE.EXT
Ich beschäftigte mich mit CRLF
-Problemen und beschloss, ein wirklich einfaches Werkzeug für die Konvertierung (in NodeJS) zu erstellen:
Es ist NodeJS EOL-Konverter CLI
Wenn Sie also NodeJS mit npm installiert haben, können Sie es versuchen:
npm i -g eol-converter-cli
eolConverter crlf "**/*.{txt,js,Java,etc}"
Der Pfad kann unter Verwendung des Glob-Regex (der gleiche Regex wie in Shell) dynamisch konfiguriert werden.
Wenn Sie NodeJS verwenden können, ist dies sehr einfach und Sie können diesen Befehl integrieren, um den gesamten Arbeitsbereich in die gewünschten Zeilenenden umzuwandeln.
Aufbauend auf den hilfreichen Antworten von TampaHaze und MD XF.
Dadurch werden alle TXT-Dateien in Stelle im aktuellen Verzeichnis von LF in CRLF in der Eingabeaufforderung geändert
for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )
Wenn Sie nicht jede einzelne Änderung überprüfen möchten
bewegung
Zu
bewegen Sie/y
Um Unterverzeichnisse zu ändern
dir/b
Zu
dir/b/s
Um dies alles in einer Batch-Datei einschließlich der Unterverzeichnisse zu tun, ohne die Verwendung unten zu bestätigen
@echo off
setlocal enabledelayedexpansion
for /f %%f in ('dir /s /b "*.txt"') do (
type %%f | more /p > %%f.1
move /y %%f.1 %%f > nul
@echo Changing LF-^>CRLF in File %%f
)
echo.
pause
versuche dies:
(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos
Sitzungsprotokoll:
C:\TEST> xxd -g1 file.unix .__0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 .__ 0000010: 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 39 .486897463261819. 0000020: 37 0a 37 32 30 30 33 33 33 31 31 32 38 35 7.72001373919285 .__ 0000030: 34 37 0a 35 32 32 31 35 32 32 30 32 30 47.5022815732020 0000040: 35 32 34 0a 524 . C:\TEST> (für/f "delims ="% i in (file.unix) do @echo% i)>. dos C:\TEST> xxd -g1 datei.dos .__0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 .__ 0000010: 0d 0a 34 36 36 38 39 37 34 36 33 32 36 31 38 31 ..48689746326181 0000020: 39 37 0d 0a 37 32 30 30 31 33 37 33 39 31 39 32 97..720013739192. 0000030: 38 35 34 37 0d 0a 35 30 32 32 38 31 35 37 33 32 8547..5022815732 ... 0000040: 30 32 30 35 32 34 0d 0a 020524 ..
Mein Beitrag dazu, mehrere Dateien in einem Ordner zu konvertieren: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp
Sie können ein einfaches Batch-Skript erstellen, um dies für Sie zu erledigen:
TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1
Dann führen Sie <batch script name> <FILE>
und <FILE>
sofort in DOS-Zeilenenden aus.
Basierend auf der Antwort von Endoro, versuchen Sie jedoch Folgendes:
@echo off
setlocal enabledelayedexpansion
(for /f "tokens=* delims=:" %%i in ('findstr /n "^" file.unix') do (
set line=%%i
set line=!line:*:=!
echo(!line!
))>file.dos
Ich habe mein Git-Projekt mit dem git bash
auf windows
geklont. Alle Dateien hatten dann LF
Endungen. Unser Repository hat standardmäßig CRLF
Endungen.
Ich habe das Projekt gelöscht und dann mit Windows Command Prompt
erneut geklont. Die CRLF
-Enden waren dann intakt. Wenn ich die Endungen für das Projekt geändert hätte, hätte dies in meinem Fall zu einem großen Commit geführt und hätte meinen Teamkollegen Ärger gebracht. Also, habe es so gemacht. Hoffe das hilft jemandem.
Ich nehme an einem AWS-Kurs teil und musste häufig Textfelder in den AWS-Webformularen in Windows Notepad kopieren. So bekomme ich den LF-begrenzten Text nur in meine Zwischenablage. Ich habe aus Versehen festgestellt, dass das Einfügen in meinen Delphi-Editor und das anschließende Drücken von Strg + K + W den Text in eine Datei mit CR + LF-Begrenzern schreibt. (Ich wette, dass viele andere IDE Redakteure dasselbe tun würden).