在批处理脚本中将换行符分配给变量

11

以下是我编写的批处理脚本

@echo off
setlocal enabledelayedexpansion
set finalcontent=
For /F "tokens=1-2* delims=  " %%I in (abc.txt) do (
IF %%J EQU MAJORVER (
set currentline=%%I %%J %1
set finalcontent=!finalcontent!!currentline!
) ELSE IF %%J EQU MINORVER (
set currentline=%%I %%J %2
set finalcontent=!finalcontent!!currentline!
) ELSE IF %%J EQU BUILDNUM (
set currentline=%%I %%J %3
set finalcontent=!finalcontent!!currentline!
) ELSE (
set currentline=%%I %%J %%K%NL%
set finalcontent=!finalcontent!!currentline!
)
)
echo %finalcontent%>>xyz.txt

我希望在变量currentline的每个出现位置后添加一个换行符。有人能指导我吗?

2个回答

29

你可以创建一个真正的换行符,并将其赋值给一个变量。

setlocal EnableDelayedExpansion
set LF=^


rem TWO empty lines are required
echo This text!LF!uses two lines

换行符最适合延迟扩展,您也可以将其与百分号扩展一起使用,但这样会更加复杂。

set LF=^


rem TWO empty lines are required
echo This text^%LF%%LF%uses two lines
echo This also^

uses two lines

它是如何工作的?
插入符号(caret)是一个转义字符,它转义下一个字符并且自身被移除。
但如果下一个字符是换行符,则换行符也会被移除,只有下一个字符被有效转义(即使它也是换行符)。

因此,需要两行空白,LF1将被忽略,LF2会被转义,而LF3是必要的来完成“行”。

set myLinefeed=^<LF1>
<LF2>
<LF3>

提示:
通常最好使用一种完全不同的格式定义换行变量,以避免意外删除所需的空行。

(SET LF=^
%=this line is empty=%
)

我经常删除其中一个空行,并且一直寻找为什么我的程序不再工作。

而偏执版本还检查换行变量是否包含空格或其他垃圾字符。

if "!LF!" NEQ "!LF:~0,1!" echo Error "Linefeed definition is defect, probably multiple invisble whitespaces at the line end in the definition of LF"

FOR /F "delims=" %%n in ("!LF!") do (
  echo Error "Linefeed definition is defect, probably invisble whitespaces at the line end in the definition of LF"
)

1
这真是太好了。我已经使用这种语言很久了,几乎每周都会学到全新的东西。它有很多微小的怪癖,令人惊叹。谢谢。 - dgo
我认为OP想要存储和构建一个包含换行符的字符串,然后将整个字符串推送到文本文件中,这与我正在尝试实现的目标非常相似。你建议的方法对我不起作用... - LPVOID
1
@LPVOID 这个解决方案正好适用于构建包含换行符的字符串的情况。"对我不起作用"并不是一个非常有帮助的问题描述。 - jeb
(SET LF=^⏎%=this line is empty=%⏎) 在交互模式下不起作用,但在 *.bat 文件中有效。(这只是为读者提供的一些额外细节。答案非常棒。) - Sasha
1
@Sasha 你说得对,它失败是因为在命令行上下文中没有删除 %=this line is empty=%。但是如果你去掉百分号部分,它就可以再次工作了 (SET LF=^⏎⏎) - jeb

9
您可以按照以下方式定义换行符:
set newline=^& echo.

然后,你可以在echo语句中使用换行符,像这样:(但在所述情况下不适用)
echo %finalcontent%%newline%

或者您可以在每个集合语句中使用换行符,像这样:(注意额外的符号)
set finalcontent=!finalcontent!!currentline!^!newline!

或类似地:
set currentline=%%I %%J %1^%newline%

1
我最初将此标记为-1,因为后来发现这个方法可行,但在启用延迟扩展(即!var!而不是%var%)时不起作用。建议在顶部加粗处添加该信息。如果您编辑了答案,我可以给它点赞,否则我无法更改我的投票。 ;) - Arvo Bowen
2
不是 -1,但这并不是真正的\n,而是一个宏。 - ScriptKidd

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