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