Existe-t-il une commande Windows pour convertir les fins de ligne d'un fichier?
Nous avons un test.bat
que nous devons exécuter pour démarrer notre serveur. Nous utilisons Perforce et nous avons besoin de fins de ligne Unix dans notre espace de travail. Pour une raison quelconque, nous ne sommes pas autorisés à modifier les fins de ligne en Windows dans nos espaces de travail. Cependant, le serveur fonctionne sous Windows.
Chaque fois que je dois exécuter le fichier bat, je l'ouvre dans Notepad ++ et choisissez Edition → Conversion EOL → Windows. Existe-t-il un moyen d'automatiser cette opération afin d'éviter de modifier manuellement les fins de ligne à chaque synchronisation avec Perforce?
Merci d'avance.
Cela peut être fait très facilement à l’aide de la commande more
incluse dans Windows NT et versions ultérieures. Pour convertir input_filename
qui contient UNIX EOL (End Of Line) \n
en output_filename
qui contient Windows EOL \r\n
, procédez comme suit:
TYPE input_filename | MORE /P > output_filename
La commande more
a des options de formatage supplémentaires que vous ignorez peut-être. Exécutez more/?
pour savoir ce que more
peut faire d'autre.
Vous pouvez le faire sans outils supplémentaires dans VBScript:
Do Until WScript.StdIn.AtEndOfStream
WScript.StdOut.WriteLine WScript.StdIn.ReadLine
Loop
Placez les lignes ci-dessus dans un fichier unix2dos.vbs
et exécutez-le comme ceci:
cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt
ou comme ceci:
type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt
Vous pouvez également le faire dans PowerShell:
(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" |
Set-Content "C:\path\to\output.txt"
qui pourrait être encore simplifié à ceci:
(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt"
L’instruction ci-dessus fonctionne sans remplacement explicite, car Get-Content
divise implicitement les fichiers d’entrée sous n’importe quel type de saut de ligne (CR, LF et CR-LF), et Set-Content
joint le tableau d’entrée avec les sauts de ligne Windows (CR-LF) avant de l’écrire dans un fichier. fichier.
Windows 'MORE n'est pas fiable, il détruit les tabulations de façon inévitable et ajoute des lignes.
unix2dos fait également partie de MinGW/MSYS, Cygutils, GnuWin32 et d’autres collections de ports binaires unix - et peut déjà être installé.
Lorsque python est présent, cette ligne transforme les fins de ligne en plate-forme actuelle - sur n’importe quelle plate-forme:
TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT
ou
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT
Ou mettez le one-liner dans un script .bat/Shell et sur le PATH en fonction de votre plate-forme:
@REM This is any2here.bat
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1
et utiliser cet outil comme
any2here UNIXFILE.EXT > MYPLATFILE.EXT
Je m'occupais de problèmes CRLF
alors j'ai décidé de construire un outil de conversion vraiment simple (en NodeJS):
C'est NodeJS EOL converter CLI
Donc, si vous avez NodeJS avec npm installé, vous pouvez l’essayer:
npm i -g eol-converter-cli
eolConverter crlf "**/*.{txt,js,Java,etc}"
Le chemin peut être configuré dynamiquement en utilisant Glob regex (même regex que dans Shell).
Donc, si vous pouvez utiliser NodeJS, c'est très simple et vous pouvez intégrer cette commande pour convertir un espace de travail entier en fins de ligne souhaitées.
S'appuyant sur les réponses utiles de TampaHaze et MD XF.
Cela modifiera tous les fichiers .txt in place dans le répertoire actuel de LF à CRLF dans l'invite de commande
for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )
Si vous ne voulez pas vérifier chaque changement
bouge toi
À
bouger/y
Pour inclure les sous-répertoires change
dir/b
À
dir/b/s
Pour faire tout cela dans un fichier de commandes comprenant des sous-répertoires sans demander l’utilisation ci-dessous
@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
essaye ça:
(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos
Protocole de session:
C:\TEST> xxd -g1 file.unix 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 6168962930810865 0000010: 0a 34 38 36 38 39 37 36 36 33 32 36 31 38 31 39 .486897463261819 0000020: 37 0a 37 32 30 30 31 33 33 39 31 39 32 38 35 7.72001373919285 0000030: 34 37 0a 35 30 32 32 38 35 35 32 33 33 30 30 32 30 47.5022815732020 0000040: 35 32 34 0a 524 . C:\TEST> (pour/f "delims ="% i in (fichier.unix) do @echo% i)> fichier. dos C:\TEST> xxd -g1 fichier.dos 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 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 33 33 33 39 31 39 32 97..720013739192 0000030: 38 35 34 37 0d 35 30 32 32 38 31 35 37 33 32 8547..5022815732 0000040: 30 32 30 35 32 34 0d 0a 020524 ..
Ma contribution pour cela, la conversion de plusieurs fichiers dans un dossier: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp
Vous pouvez créer un script batch simple pour le faire pour vous:
TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1
Ensuite, exécutez <batch script name> <FILE>
et <FILE>
sera instantanément converti en fins de ligne DOS.
Basé sur la réponse d'Endoro, mais pour garder les blancs, essayez ceci:
@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
J'ai cloné mon projet git en utilisant le git bash
sur windows
. Tous les fichiers avaient alors des fins LF
. Notre référentiel a CRLF
terminaisons par défaut.
J'ai supprimé le projet, puis je l'ai cloné à nouveau à l'aide du Windows Command Prompt
. Les fins CRLF
étaient intactes alors. Dans mon cas, si j'avais changé les terminaisons du projet, cela aurait entraîné un énorme engagement et aurait causé des problèmes à mes coéquipiers. Alors, est-ce que ça se passe comme ça? J'espère que ça aide quelqu'un.
Je suis un cours AWS et dois souvent copier des zones de texte dans les formulaires Web AWS vers le Bloc-notes Windows. Donc, je reçois le texte délimité par LF uniquement dans mon presse-papiers. J'ai accidentellement découvert que le coller dans mon éditeur Delphi, puis appuyer sur Ctrl + K + W écrirait le texte dans un fichier avec des délimiteurs CR + LF. (Je parie que beaucoup d'autres IDE éditeurs feraient de même).