转换Unix行结尾的Windows命令?

转换Unix行结尾的Windows命令?,windows,unix,batch-file,cmd,eol,Windows,Unix,Batch File,Cmd,Eol,是否有Windows命令来转换文件的行尾 我们有一个test.bat,需要运行它来启动服务器。我们使用Perforce,我们的工作区中需要有unix行结尾。由于某些原因,我们不允许在工作区中将行尾更改为窗口。但是,服务器在Windows上运行 每次我必须运行bat文件时,我都会在记事本++中打开它并选择编辑→下线转换→窗户。是否有一种方法可以自动执行此操作,这样我们就不必每次与Performance同步时都手动更改行尾 提前感谢。使用实用程序。您可以下载二进制文件。 无需在VBScript中使用

是否有Windows命令来转换文件的行尾

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

每次我必须运行bat文件时,我都会在记事本++中打开它并选择编辑→下线转换→窗户。是否有一种方法可以自动执行此操作,这样我们就不必每次与Performance同步时都手动更改行尾

提前感谢。

使用实用程序。您可以下载二进制文件。


无需在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"
上面的语句在没有显式替换的情况下工作,因为
Get Content
以任何类型的换行符(CR、LF和CR-LF)隐式拆分输入文件,并且
Set Content
在将输入数组写入文件之前将其与Windows换行符(CR-LF)连接起来。

尝试以下操作:

(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos
@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
会话协议:

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.. 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 32 36 31 38 31 39.486897463261819 0000020:37 0a 37 32 30 31 33 33 39 39 32 38 35 7.72001373919285 0000030:34 37 0a 35 30 32 38 31 35 33 32 30 32 30 47.502281573202 0000040:3532340A524。 C:\TEST>(对于/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 33 32 36 31 31..48689746326181 0000020:39 37 0d 0a 37 32 30 31 33 33 39 31 39 32 97..720013739192 0000030:38 35 34 37 0d 0a 35 30 32 38 31 35 37 33 32 8547..5022815732 0000040:30 32 30 35 32 34 0d 0a 020524。。
我对此的贡献,转换文件夹中的多个文件:
for%%z in(*.txt)do(for/f“delims=“%%i in(%%z)do@echo%%i)>%%z.tmp

基于Endro的回答,但为了保留空白,请尝试以下操作:

@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

实际上,使用Windows NT和更高版本中包含的
more
命令可以非常轻松地完成此操作。要将包含UNIX EOL(行尾)的
输入文件名
转换为包含Windows EOL的
输出文件名
,只需执行以下操作:

TYPE input_filename | MORE /P > output_filename

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

Windows的MORE不可靠,它不可避免地会破坏选项卡并添加行

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

存在时,此一行程序将任何行端点转换为当前平台-在任何平台上:

MYPLATFILE.EXT
键入UNIXFILE.EXT | python-c“导入sys;sys.stdout.write(sys.stdin.read())”>

python-c“导入sys;sys.stdout.write(打开(sys.argv[1]).read())”UNIXFILE.EXT>MYPLATFILE.EXT
或者将一行代码放入.bat/shell脚本中,并根据您的平台放置在路径上:

@REM这是any2here.bat
python-c“导入sys;sys.stdout.write(打开(sys.argv[1]).read())%1
然后像这样使用这个工具

any2here UNIXFILE.EXT>MYPLATFILE.EXT

您可以创建一个简单的批处理脚本来执行此操作:

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

然后运行
将立即转换为DOS行尾。

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

它是

因此,如果您安装了带有npm的NodeJ,您可以尝试:

npm i -g eol-converter-cli
eolConverter crlf "**/*.{txt,js,java,etc}"
可以使用globregex(与shell中的regex相同)动态配置路径


因此,如果您可以使用NodeJS,它非常简单,您可以集成此命令将整个工作区转换为所需的行尾。

基于TampaHaze和MD XF的有用答案

这将在命令提示符下将当前目录中的所有.txt文件从LF更改为CRLF

for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )
如果您不想验证每一个更改

移动

移动/y

要包含子目录,请更改

目录/b

dir/b/s

要在批处理文件(包括子目录)中执行所有这些操作,无需在下面提示使用

@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

我使用
windows
上的
gitbash
克隆了我的git项目。所有文件都有
LF
结尾。我们的存储库默认有
CRLF
结尾


我删除了该项目,然后使用
Windows命令提示符
再次克隆了它。那时,
CRLF
末端完好无损。在我的情况下,如果我改变了项目的结尾,那么它将导致一个巨大的承诺,并会给我的队友带来麻烦。所以,就这样做了。希望这对别人有帮助

我正在学习AWS课程,经常需要将AWS web表单中的文本框复制到Windows记事本。因此,我只在剪贴板上获取LF分隔的文本。我意外地发现,将其粘贴到我的Delphi编辑器中,然后按Ctrl+K+W将文本写入带有CR+LF分隔符的文件。(我敢打赌许多其他IDE编辑器也会这样做)。

要将UNIX(LF)转换为Windows(CR-LF),请在Windows终端上使用next命令

type file.txt > new_file.txt
如果您有bash(例如git bash),则可以使用以下脚本从unix2dos转换:


ex filename.ext这里有一个简单的unix2dos.bat文件,它保留了空行和感叹号:

@echo off
setlocal DisableDelayedExpansion
for /f "tokens=1,* delims=:" %%k in ('findstr /n "^" %1') do echo.%%l
输出转到标准输出,因此重定向unix2dos.bat输出t
@echo off
setlocal DisableDelayedExpansion
for /f "tokens=* delims=0123456789" %%l in ('findstr /n "^" %1') do echo%%l
@echo off
(
    setlocal Disabledelayedexpansion
    for /f "tokens=* delims=" %%L in ('findstr /n "^" "%~1"') do (
        set "line=%%L"
        setlocal enabledelayedexpansion
        set "line=!line:*:=!"
        (echo(!line!)
        endlocal
    )
) > file.dos