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

Axo*_*onn 3 batch-file

我尝试过以下方法:

@echo off
REM New line.
set LF=^& echo.
set multiline=multiple%LF%lines%LF%%LF%of%LF%text

echo %multiline%

echo %multiline% > text.txt
Run Code Online (Sandbox Code Playgroud)

它只保存文本的第一行.

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

Ste*_*han 5

pauseset命令之后花费你的脚本- 并且感到惊讶;)

之后,将其更改为:

@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
Run Code Online (Sandbox Code Playgroud)

  • 是.否则,只有最后一个`echo`会被重定向.封闭在parantheses中的一些命令称为"代码块".另请参阅dbenhams回答"真正的"换行符. (2认同)

dbe*_*ham 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
Run Code Online (Sandbox Code Playgroud)

您可以在解释 dos-batch newline variable hack 的工作原理中阅读有关在变量中使用换行符的更多信息。我使用的代码看起来不同,但它有效,因为我使用了一个
%= undefined variable as comment =%扩展为空的代码。

如果您希望每一行都遵循回车/换行的 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
Run Code Online (Sandbox Code Playgroud)