如何在 Windows 批处理脚本中连接换行符
Posted
技术标签:
【中文标题】如何在 Windows 批处理脚本中连接换行符【英文标题】:How to concat new line character in windows batch script 【发布时间】:2022-01-20 08:00:48 【问题描述】:我有以下代码
@echo off
setlocal enableextensions disabledelayedexpansion
set "search=hello"
set "replace=hello world"
set "textFile=hello.text"
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%search%=%replace%!
endlocal
)
如何使用此脚本在 Hello 和 world 之间添加换行符
我的 hello.txt 包含以下内容:
def a=1
config
hello
我想换成
def a=1
config
hello
world
主要目的是在下一行的hello之后添加world
【问题讨论】:
这取决于,你想为所有用换行符分隔的单词添加换行符吗?还是仅在“Hello World”事件中? 仅在 Hello World 事件中 【参考方案1】:通过修改替换字符串你可以达到你想要的:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "search=hello"
rem // In the following, the empty lines are intentional; ensure that there are not even (trailing) spaces!
set replace=hello^^^
^
world
set "textFile=hello.txt"
for /F "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal EnableDelayedExpansion
>>"%textFile%" echo(!line:%search%=%replace%!
endlocal
)
endlocal
exit /B
使用序列 ^^^
+ line-break + line-break + ^
+ line-break + line-break 你构建了一个双转义换行符,这将导致将字符串 ^
+ line-break + line-break 分配给变量 replace
。这将在表达式 %replace%
的扩展期间扩展为单个换行符。
不幸的是,上述脚本仅使用换行符作为替换字符串中的换行符,而不是像 Windows-conform 那样使用回车加换行符。为了解决这个问题,可以使用以下脚本:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define a line-break (carriage-return plus line-feed):
for /F %%l in ('copy /Z "%~f0" nul') do (set ^"nl=%%l^
%=empty line =%
^")
set "search=hello"
rem // Use defined line-break variable here (it will not yet be expanded here):
set "replace=hello!nl! world"
set "textFile=hello.txt"
setlocal EnableDelayedExpansion
rem // At this point the line-break variable is going to be expanded:
for %%j in ("%replace%") do (
rem /* Use `findstr /N` rather than `type` to precede every line with
rem line number plus `:` to avoid loss of empty lines due to `for /F`: */
for /F "delims=" %%i in ('findstr /N "^^" "!textFile!" ^& break ^> "!textFile!"') do (
endlocal & set "line=%%i" & setlocal EnableDelayedExpansion
rem // Remove line number prefix:
set "line=!LINE:*:=!"
rem // Actually perform sub-string replacement:
>>"!textFile!" echo(!line:%search%=%%~j!
)
)
endlocal
endlocal
exit /B
这种方法还在文本文件中保留空白行。
【讨论】:
以上是关于如何在 Windows 批处理脚本中连接换行符的主要内容,如果未能解决你的问题,请参考以下文章
开发环境Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | 换行 | Runtime 执行 Cmd 命令 )