2011-06-16 12 views
57

有人可以請解釋這是如何工作的?解釋如何使用批處理的新行變量破解工作

@echo off 
REM Creating a Newline variable (the two blank lines are required!) 
set NLM=^ 


set NL=^^^%NLM%%NLM%^%NLM%%NLM% 
REM Example Usage: 
echo There should be a newline%NL%inserted here. 

發出:

There should be a newline 
inserted here. 

How can you echo a newline in batch files?

+0

有什麼理由這樣做除了創建一個新的空行? – Mechaflash 2011-06-17 14:13:14

+0

有很多,我給我的回答加了一些解釋 – jeb 2011-06-20 11:07:57

回答

82

訣竅使用符的行爲。
Long commands split over multiple lines in Vista/DOS batch (.bat) file

插入符號還解釋爲下一個字符轉義字符,或在線路端它被用作多字符,但是這幾乎是相同的。

在生產線最後乾脆逃避的下一個字符,在這種情況下,<Linefeed>,但有一個隱藏的功能,因此,如果轉義字符是一個<LF>它被忽略,下一個字符被讀取並逃過一劫,但這種charater將永遠逃脫,即使它也是<LF>

現在,你可以理解

set NLM=^ 


rem Two empty lines are required here 

的NLM變量只包含一個<LF>字符。 但是,如果您嘗試將其與echo Line1%NLM%Line2結合使用,則會失敗,因爲解析器會停止解析單個<LF>
但這部作品

echo Line1^ 

Line2 

所以,你需要添加一個換行符逃脫入行,並且是NL-變量。 NL變量只包含三個字符。
NL=^<LF><LF> 如果這是擴展,它將創建只有一個轉義<LF>作爲第一<LF>後插入符號將被忽略。

Btw。在我看來,使用延遲擴展的換行要容易得多,因爲沒有必要逃脫任何東西。
在此示例中,我使用%=EMPTY=%而不是空行(用於自我評論),但由於變量=EMPTY=不能存在,所以它將展開爲空行。

setlocal EnableDelayedExpansion 
(set NLM=^ 
%=EMPTY=% 
) 
echo Line1!NLM!Line2 

編輯:使用<LF>

1追加一些提示有用)使用它作爲新行中的echo

setlocal EnableDelayedExpansion 
(set LF=^ 
%=EMPTY=% 
) 
echo Line1!LF!Line2 

2)使用它在一個括號塊分割的命令

setlocal EnableDelayedExpansion 
(set LF=^ 
%=EMPTY=% 
) 
(
    echo Line1%LF%set x=4%LF%echo !x!%LF% 
) 

3)在FOR/F循環中創建一個(幾乎)空的EOL字符集, ,因爲<LF>是行分隔符,因此<LF>的EOL與空行相同。

FOR /F ^"eol^=^ 

delims^=^" %%a in (myFile.php) do echo %%a 

4)使用LF在一個FOR/F環

setlocal EnableDelayedExpansion 
(set LF=^ 
%=EMPTY=% 
) 
set "var=Content1;Content2" 
FOR /F "delims=" %%a in ("%var:;=!LF!%") do (
    echo %%a 
) 
+0

偉大的話題!如何將一個換行符插入到一個字符串中,我將在建立多行字符串後進行回顯?謝謝 – RGuggisberg 2016-11-04 21:46:27

+0

@Ruggisberg我不確定是否有你的問題,但也許你的意思是'set multiStr = Line1!LF!Line2&echo!multiStr!' – jeb 2016-11-05 02:58:39

+0

Ahhh yes!得到它了。謝謝jeb – RGuggisberg 2016-11-07 14:17:12

5

有分裂的文字似乎way,也可用於管道:

(echo 1st line^ 
&echo 2nd line) | sort 
+0

但這也排序每一行。所以這個技巧不適用於連接多行文件 – Armin 2017-02-06 18:25:45