有没有Windows命令可以转换文件的行结尾?
我们有一个需要运行来启动服务器的 test.bat
文件。 我们使用Perforce,并且我们需要在工作区中拥有Unix行结尾。由于某种原因,我们不被允许将行结尾更改为Windows。但是,服务器在Windows上运行。
每次我必须运行bat文件时,我都会在Notepad ++中打开它,然后选择Edit→EOL conversion→Windows。 有没有一种自动化这个过程的方法,以便我们不需要每次与Perforce同步时手动更改行结尾?
有没有Windows命令可以转换文件的行结尾?
我们有一个需要运行来启动服务器的 test.bat
文件。 我们使用Perforce,并且我们需要在工作区中拥有Unix行结尾。由于某种原因,我们不被允许将行结尾更改为Windows。但是,服务器在Windows上运行。
每次我必须运行bat文件时,我都会在Notepad ++中打开它,然后选择Edit→EOL conversion→Windows。 有没有一种自动化这个过程的方法,以便我们不需要每次与Perforce同步时手动更改行结尾?
TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1
然后运行<批处理脚本名称> <文件名>
,<文件名>
将立即转换为DOS行结束符。
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!
中的任何内容,并且外部括号避免了行末的意外空格。@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
要将UNIX(LF)转换为Windows(CR-LF),请在Windows终端上使用以下命令。
type file.txt > new_file.txt
ls <dir> | %{ (Get-Content $_.FullName) | Set-Content $_.FullName }
很简单吧?只有一个小问题:如果文件末尾没有CRLF,则会在文件末尾添加一个。对于我的目的来说,这是一个奖励,而不是问题!
如果要使用more
解决方案将LF回车转换为CRLF,而不会导致任何制表符转换为空格,请尝试使用find /V
命令,该命令由Wikipedia提供:
find /V "" < input_filename > output_filenam
@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
(for /f "tokens=*" %%a in (%~1) do @echo.%%a)>"%~2"
这样的东西,它就可以工作。 - Ansgar Wiechersset TargetFile=%2 rem c:\test\out.txt
也需要改进。另外,顺便说一下,你的 "tokens=*"
也是。 - Endoro