2010-08-26 155 views
7

下分配换行符变量是批处理脚本我写在批处理脚本

@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的每一次出现的末尾追加一个换行符。任何人都可以指导我吗?

回答

5

您可以定义新行如下:

set newline=^& echo. 

然后,您可以使用换行符回声语句,像这样:(并不适用于列出的情况,不过)

echo %finalcontent%%newline% 

,或者您可以使用新行中的每个设置语句,像这样:(介意额外插入符号)

set finalcontent=!finalcontent!!currentline!^!newline! 

或类似的:

set currentline=%%I %%J %1^%newline% 
+1

我最初把它标记为-1,因为后来我发现这个方法可行,但不能用EnableDelayedExpansion(AKA!var!代替%var%)。可能要考虑在顶部以粗体添加回答。所以我可以放弃这一点,除非答案被编辑,否则我不能改变我的投票。 ;) – 2015-01-14 18:02:36

16

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

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 

它是如何工作的?
插入符号是一个转义字符,它逃脱了下一个字符,本身被删除。
但是如果下一个字符是换行符,换行符也会被删除,只有下一个字符被有效地转义(即使这也是换行符)。

因此,需要两条空行,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

这很热。我一直在使用这种语言,并且几乎每周都会学习全新的东西。令人惊讶的是它有多少小怪癖。谢谢 – user1167442 2017-01-04 18:30:01