将Unix行结尾转换为Windows格式的命令?

86

有没有Windows命令可以转换文件的行结尾?

我们有一个需要运行来启动服务器的 test.bat 文件。 我们使用Perforce,并且我们需要在工作区中拥有Unix行结尾。由于某种原因,我们不被允许将行结尾更改为Windows。但是,服务器在Windows上运行。

每次我必须运行bat文件时,我都会在Notepad ++中打开它,然后选择Edit→EOL conversion→Windows。 有没有一种自动化这个过程的方法,以便我们不需要每次与Perforce同步时手动更改行结尾?

19个回答

2
我使用Windows上的git bash克隆了我的git项目。然后所有的文件都有LF结尾。我们的代码库默认是CRLF结尾。
我删除了这个项目,然后使用Windows命令提示符再次克隆它。这时候CRLF结尾保持不变。在我的情况下,如果我改变了项目的结尾,那么会导致一个巨大的提交并给我的队友带来麻烦。所以我就这样做了。希望这能帮助到一些人。

有一种方法可以使用git将CRLF转换为LF,我刚刚尝试了您的方法以获取LF结尾,但无法使其正常工作。因此,我决定更改git配置,以下是代码片段:$ git config --global core.autocrlf input - Ziumper

2
您可以创建一个简单的批处理脚本来为您完成这个操作:
TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1

然后运行<批处理脚本名称> <文件名><文件名> 将立即转换为DOS行结束符。


1
晚到派对了,但仍然没有使用FOR /F循环的正确答案。 (但是你根本不需要FOR循环,@TampaHaze的解决方案也可以,并且更简单) @IR的答案有一些缺点。 它会删除感叹号,也可能会删除插入符。
@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

关键在于使用findstr /n将每行前缀为<line number>:,这可以避免跳过空行或以;开头的行。
要删除<number>:,不能使用FOR "tokens=1,* delims=:"选项,因为这也会删除行中所有前导冒号。
因此,通过set "line=!line:*:=!"来删除行号,这需要启用EnableDelayedExpansion
但是使用EnableDelayedExpansion后,行set "line=%%L"会丢失所有感叹号和插入符(仅当行中有感叹号时)。
这就是为什么我在必要时禁用延迟扩展,并仅在需要它的两行中启用它的原因。 (echo(!line!)看起来很奇怪,但它的优点在于echo(可以显示!line!中的任何内容,并且外部括号避免了行末的意外空格。

1
基于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

Ir Relevant的解决方案很好,除了它会丢弃所有感叹号(!)以外。 - mgcoder

1

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

type file.txt > new_file.txt

0
虽然有点晚了,但我真的需要一个简短、简单、纯粹的 Windows 解决方案。有很多其他的答案,但我发现 FOR /F、MORE、FIND 等等都以各种巧妙的方式失败了,而且我不想使用 EXE、Python、VBS、Node 等等。在这个现代化的时代,显然的答案必须是 PowerShell。所以这就是我的代码。
ls <dir> | %{ (Get-Content $_.FullName) | Set-Content $_.FullName }

很简单吧?只有一个小问题:如果文件末尾没有CRLF,则会在文件末尾添加一个。对于我的目的来说,这是一个奖励,而不是问题!


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

0

如果要使用more解决方案将LF回车转换为CRLF,而不会导致任何制表符转换为空格,请尝试使用find /V命令,该命令由Wikipedia提供:

find /V "" < input_filename > output_filenam

与“more”答案类似,这并不会进行原地更改。但是不需要外部程序。 “/V”表示输出任何不匹配空字符串模式的输入行,并在需要时将行终止符漂亮地更改为Windows CRLF。

-2

在文本文件中插入回车符

@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

2
实际上,如果他只是使用类似于(for /f "tokens=*" %%a in (%~1) do @echo.%%a)>"%~2"这样的东西,它就可以工作。 - Ansgar Wiechers
@AnsgarWiechers 是的,这个 set TargetFile=%2 rem c:\test\out.txt 也需要改进。另外,顺便说一下,你的 "tokens=*" 也是。 - Endoro
1
@Endoro REM 是批处理文件中的注释,您可以删除 %1 rem 并将其替换为您需要的特定文件。由于我已经提供了链接,所以我觉得不需要进一步说明,因为您已经在使用批处理文件,对吗?请测试一下,它是有效的,并且可以随意集成到您现有的批处理文件中。谢谢! - Jimmy Smith
在我的 Windows 7 上运行良好。 我使用 Notepad++ 创建了一个带有 Unix 换行符结尾的文件 c:\ test \ test.txt,然后简单地运行了批处理文件。 再次说明,这不是我的代码,而是我稍微修改的代码,以不显示记事本? 我可以向 OP 显示如何使其正常工作,而不是上一个评论中的做法。 - Jimmy Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接