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

Rah*_*hul 9 batch-file

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

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

我想在变量当前行的每个出现的末尾追加一个换行符.任何人都可以指导我吗?

jeb*_*jeb 22

您可以创建一个真实的换行符并将其分配给变量.

setlocal EnableDelayedExpansion
set LF=^


rem TWO empty lines are required
echo This text!LF!uses two lines
Run Code Online (Sandbox Code Playgroud)

换行最好与延迟扩展一起使用,你也可以将它与扩展百分比一起使用,但它更复杂一点.

set LF=^


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

uses two lines
Run Code Online (Sandbox Code Playgroud)

这个怎么运作?
插入符是一个转义字符,它逃脱了下一个字符,并且它本身被删除.
但是如果下一个字符是换行符,则换行也会被删除,只有下一个字符被有效地转义(即使这也是一个换行符).

因此,需要两个空行,LF1被忽略LF2被转义并且LF3必须完成"行".

set myLinefeed=^<LF1>
<LF2>
<LF3>
Run Code Online (Sandbox Code Playgroud)

提示:
使用完全不同格式的换行变量定义通常会更好,以避免无意中删除所需的空行.

(SET LF=^
%=this line is empty=%
)
Run Code Online (Sandbox Code Playgroud)

我经常删除其中一个空行,然后我永远搜索为什么我的程序不再工作了.

而偏执狂版本也检查换行变量的空格或其他垃圾.

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

  • 太热了。我一直在使用这种语言,而且几乎每周我都会学到全新的东西。令人惊奇的是它有这么多的小怪癖。谢谢 (2认同)

mou*_*sio 8

您可以按如下方式定义换行符:

set newline=^& echo.
Run Code Online (Sandbox Code Playgroud)

然后,您可以在echo语句中使用换行符,如下所示:(但不适用于概述的情况)

echo %finalcontent%%newline%
Run Code Online (Sandbox Code Playgroud)

或者你可以在每个set语句中使用换行符,如下所示:(注意额外的插入符号)

set finalcontent=!finalcontent!!currentline!^!newline!
Run Code Online (Sandbox Code Playgroud)

或类似的:

set currentline=%%I %%J %1^%newline%
Run Code Online (Sandbox Code Playgroud)

  • **不是**-1,但这**不是***真正的`\n`,而是一个宏 (3认同)