使用批处理将多行变量保存到文件中

4
我已经尝试了以下方法:
@echo off
REM New line.
set LF=^& echo.
set multiline=multiple%LF%lines%LF%%LF%of%LF%text

echo %multiline%

echo %multiline% > text.txt

它只保存文本的第一行。

所以我想唯一的方法是使用for循环?


5
您实际上并没有尝试创建一个包含多行的变量,而是尝试创建一个包含“宏”的变量,当执行时会生成多行。两者之间有很大的区别。 - dbenham
2个回答

5
给你的脚本在 set 指令之后加上一个 pause - 会让你惊喜不已 ;)
然后,把它改成:
@echo off
REM New line.
set LF=^& echo.
set "multiline=multiple%LF%lines%LF%%LF%of%LF%text"
echo %multiline%
(echo %multiline%) > text.txt
type text.txt

我猜这是通过阅读答案来学习批处理的方式。所以,括号实际上使整个输出进入文件。 - Axonn
2
是的。否则,只有最后一个“echo”会被重定向。括在括号中的一些命令被称为“代码块”。此外,请查看dbenhams答案以获取“真正”的换行符。 - Stephan
不幸的是,“真正的”换行符实际上并不太好用。它不会在Notepad.exe中显示,只会在Notepad++中显示(显然,如果我没记错的话,Notepad.exe需要完整的CRLF来进行换行)。 - Axonn
1
请参考此处(http://stackoverflow.com/a/29574760/2152082)如何创建一个`CR`:`for /F %%a in ('copy /Z "%~F0" NUL') do set CR=%%a(使用时,也要使用延迟扩展:!CR!`)。 - Stephan
如果我不想使用延迟扩展怎么办? :) - Axonn

5

你的代码从未尝试创建一个包含多行文本的变量。相反,你正在尝试创建一个包含多个命令(宏)的变量,当执行时会产生多行文本。

这里是一个简单的脚本,真正创建了一个包含多行文本的变量,并将内容写入文件:

@echo off
setlocal enableDelayedExpansion

:: Create LF containing a line feed character
set ^"LF=^
%= This creates a Line Feed character =%
^"

set "multiline=multiple!LF!lines!LF!of!LF!text"
echo !multiline!
echo !multiline!>test.txt

您可以在Explain how dos-batch newline variable hack works了解有关在变量中使用换行符的更多信息。我使用的代码看起来不同,但它有效,因为我使用了一个
%=未定义变量作为注释=%,它会扩展为空。
如果您希望每行遵循Windows的回车/换行标准,则还需要创建一个回车变量。有一个完全不同的技巧可以获得回车。
@echo off
setlocal enableDelayedExpansion

:: Create LF containing a line feed character
set ^"LF=^
%= This creates a Line Feed character =%
^"

:: Create CR contain a carriage return character
for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A"

:: Define a new line string
set "NL=!CR!!LF!

set "multiline=multiple!NL!lines!NL!of!NL!text"
echo !multiline!
echo !multiline!>test.txt

尽管上述脚本打印得很好,但文本文件的内容在Notepad.exe中读取为单行,在Notepad++中则为多行。另一种产生换行符(^& echo.)的方法也会在Notepad.exe中显示为换行符。我想这是因为Notepad.exe只将完整的CRLF视为换行符,而不仅仅是LF。 - Axonn
1
@Axonn - 请查看我的更新答案,其中包含一个额外的技巧,可以将回车符放入变量中。 - dbenham
感谢您所有出色的工作:)。这是为了一个好的目的(我的开源文学项目:))。只是好奇:是否有任何可能在没有启用延迟扩展的情况下完成这些工作?启用延迟扩展是否适用于较旧的Windows操作系统? - Axonn
1
@Axonn - 延迟扩展在今天你可能会遇到的“所有”Windows版本中都可用,特别是从XP开始。如果你想在变量中使用CR,则必须使用延迟扩展,而LF也更适合延迟扩展。在没有延迟扩展的情况下使用LF变量需要非常笨拙的转义序列,我相信你不想涉及这个。 - dbenham

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