Comando di Windows per convertire le terminazioni di linea Unix?

Esiste un comando di Windows per convertire le terminazioni di riga di un file?

Abbiamo un test.bat che dobbiamo eseguire per avviare il nostro server. Usiamo Perforce e abbiamo bisogno di avere terminazioni di riga unix nel nostro spazio di lavoro. Per qualche ragione, non siamo autorizzati a modificare le terminazioni di linea su Windows nei nostri spazi di lavoro. Tuttavia, il server funziona su Windows.

Ogni volta che devo eseguire il file bat, lo apro in Notepad ++ e scegli Modifica → conversione EOL → Windows. C’è un modo per automatizzare questo in modo che non abbiamo bisogno di cambiare manualmente le terminazioni di linea ogni volta che ci sincronizziamo con Perforce?

Grazie in anticipo.

Questo può essere fatto molto facilmente usando il comando more che è incluso in Windows NT e versioni successive. Per convertire input_filename che contiene UNIX EOL (End Of Line) \n in output_filename che contiene Windows EOL \r\n , fai semplicemente questo:

 TYPE input_filename | MORE /P > output_filename 

Il comando more ha ulteriori opzioni di formattazione di cui potresti non essere a conoscenza. Eseguire more/? per imparare cos’altro può fare di più.

Utilizzare l’utilità unix2dos . Puoi scaricare i binari qui .

Puoi farlo senza strumenti aggiuntivi in ​​VBScript:

 Do Until WScript.StdIn.AtEndOfStream WScript.StdOut.WriteLine WScript.StdIn.ReadLine Loop 

Metti le linee sopra in un file unix2dos.vbs ed unix2dos.vbs in questo modo:

 cscript //NoLogo unix2dos.vbs C:\path\to\output.txt 

o in questo modo:

 type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt 

Puoi anche farlo in PowerShell:

 (Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" | Set-Content "C:\path\to\output.txt" 

che potrebbe essere ulteriormente semplificato a questo:

 (Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt" 

L’istruzione sopra riportata funziona senza una sostituzione esplicita, poiché Get-Content divide implicitamente i file di input in qualsiasi tipo di interruzione di riga (CR, LF e CR-LF) e Set-Content unisce all’array di input con i linebreak di Windows (CR-LF) prima scrivendolo su un file.

Windows ‘MORE non è affidabile, distrugge inevitabilmente i TAB e aggiunge linee.

unix2dos è anche parte di MinGW / MSYS, Cygutils, GnuWin32 e altre raccolte di porte binarie unix e potrebbe essere già installato.

Quando Python è presente, questo one-liner converte qualsiasi terminazione di linea alla piattaforma corrente su qualsiasi piattaforma:

 TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT 

o

 python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT 

Oppure metti la one-liner in uno script .bat / shell e sul PATH in base alla tua piattaforma:

 @REM This is any2here.bat python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1 

e usa quello strumento come

 any2here UNIXFILE.EXT > MYPLATFILE.EXT 

prova questo:

 (for /f "delims=" %i in (file.unix) do @echo %i)>file.dos 

Protocollo di sessione:

 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 31 33 37 33 39 31 39 32 38 35 7.72001373919285
 0000030: 34 37 0a 35 30 32 32 38 31 35 37 33 32 30 32 30 47.5022815732020
 0000040: 35 32 34 0a 524.

 C: \ TEST> (per / f "delim ="% i in (file.unix) do @echo% i)> file.dos

 C: \ TEST> xxd -g1 file.dos
 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865
 0000010: 0d 0a 34 38 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 ..

Il mio contributo per questo, la conversione di diversi file in una cartella: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp

Avevo a che fare con problemi CRLF , quindi ho deciso di creare uno strumento davvero semplice per la conversione (in NodeJS):

È il convertitore NodeJS EOL CLI

Quindi se hai NodeJS con npm installato puoi provarlo:

 npm i -g eol-converter-cli eolConverter crlf "**/*.{txt,js,java,etc}" 

Il percorso potrebbe essere configurato dynamicmente usando Glob regex (stessa regex della shell).

Quindi, se puoi usare NodeJS, è molto semplice e puoi integrare questo comando per convertire l’intero spazio di lavoro in terminazioni di linea desiderate.

Basandosi sulle utili risposte di TampaHaze e MD XF.

Ciò cambierà tutti i file .txt nella directory corrente da LF a CRLF nel Prompt dei comandi

 for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f ) 

Se non vuoi verificare ogni singola modifica

mossa

A

sposta / y

Per includere la modifica delle sottodirectory

dir / b

A

dir / b / s

Per fare tutto questo in un file batch, comprese le sottodirectory senza richiedere l’utilizzo di seguito

 @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 

Basato sulla risposta di Endoro ma per mantenere gli spazi vuoti, prova questo:

 @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 

Potresti creare un semplice script batch per farlo per te:

 TYPE %1 | MORE /P >%1.1 MOVE %1.1 %1 

Quindi eseguire e saranno convertiti all’istante in fine linea DOS.

Ho clonato il mio progetto git usando git bash su windows . Tutti i file hanno quindi terminazioni LF . Il nostro repository ha terminazioni CRLF come predefinite.

Ho eliminato il progetto e poi lo ho nuovamente clonato utilizzando il Windows Command Prompt . Le terminazioni CRLF erano intatte allora. Nel mio caso, se avessi cambiato i finali per il progetto, questo avrebbe comportato un enorme commit e avrebbe causato problemi ai miei compagni di squadra. Quindi, è stato così. Spero che questo aiuti qualcuno.

Inserimento carrello Torna a un file di testo

 @echo off set SourceFile=%1 rem c:\test\test.txt set TargetFile=%2 rem c:\test\out.txt if exist "%TargetFile%" del "%TargetFile%" for /F "delims=" %%a in ('type "%SourceFile%"') do call :Sub %%a rem notepad "%TargetFile%" goto :eof :Sub echo %1 >> "%TargetFile%" if "%2"=="" goto :eof shift goto sub