Windows命令转换Unix行结束?

有一个Windows命令来转换文件的行尾?

我们有一个test.bat ,我们需要运行来启动我们的服务器。 我们使用Perforce,我们需要在工作空间中有unix行结尾。 出于某种原因,我们不允许在工作区中将行结束符更改为Windows。 但是,服务器在Windows上运行。

每次我必须运行bat文件,我用Notepad ++打开它,然后select编辑→EOL转换→Windows。 有没有办法让这个自动化,以便我们不需要每次使用Perforce同步时手动更改行尾?

提前致谢。

这实际上可以使用Windows NT及更高版本中包含的more命令轻松完成。 要将包含UNIX EOL(行尾) \n input_filename转换为包含Windows EOL \r\n output_filename ,只需执行以下操作:

 TYPE input_filename | MORE /P > output_filename 

more命令有其他格式化选项,您可能不知道。 运行more/? 了解还有什么可以做的。

使用unix2dos实用程序。 你可以在这里下载二进制文件。

你可以在VBScript中不用额外的工具来做到这一点:

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

把上面的行放在一个文件unix2dos.vbs ,像这样运行它:

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

或者像这样:

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

您也可以在PowerShell中执行此操作:

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

这可以进一步简化为:

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

上述语句没有明确的replace,因为Get-Content在任何types的换行符(CR,LF和CR-LF)处隐式地分割input文件,并且Set-Content在input数组之前使用Windows换行符(CR-LF)写入一个文件。

尝试这个:

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

会话协议:

 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>(for / f“delims =”%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 ..

Windows“MORE”不可靠,它不可避免地破坏了TAB,并增加了线条。

unix2dos也是MinGW / MSYS,Cygutils,GnuWin32和其他unix二进制端口集合的一部分,可能已经安装了。

当python在那里时,这一行就可以将任何行结尾转换为当前平台 – 在任何平台上:

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

要么

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

或者根据你的平台把一行代码放入一个.bat / shell脚本和PATH中:

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

并使用该工具

 any2here UNIXFILE.EXT > MYPLATFILE.EXT 

我的贡献,转换一个文件夹中的几个文件: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp

根据Endoro的答案,但要保持空白,试试这个:

 @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 

我正在处理CRLF问题,所以我决定构build一个非常简单的转换工具(在NodeJS中):

这是NodeJS EOL转换器CLI

所以如果你安装了npm的NodeJS,你可以尝试一下:

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

path可以通过使用Glob正则expression式(与shell中的正则expression式相同)dynamicconfiguration。

所以,如果你可以使用NodeJS,它非常简单,你可以集成这个命令来将整个工作空间转换为所需的行尾。

你可以创build一个简单的批处理脚本来为你做这个:

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

然后运行<batch script name> <FILE><FILE>将立即转换为DOS行尾。

插入回车返回到文本文件

 @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