2010-02-12 144 views
90

是否有可能在Windows批處理文件中調用多個命令中的一個單個FOR循環?比方說,比如我要打印的文件名和後予以刪除:Windows批處理:在FOR循環中調用多個命令?

@ECHO OFF 
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X) 
REM the line above is invalid syntax. 

我知道在這種情況下,我可以做兩個不同的FOR循環解決這個問題:一個用於顯示的名稱和一個用於刪除文件,但是有可能只在一個循環中完成它?

回答

85
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X) 
+1

其實,我認爲括號是不必要的。 (1 2 3)do%echo $ i&echo foo'打印我期望的內容:「1」,「foo」,「2」,「foo」,「3」,「foo」(on單獨的行)。 – bk1e

+0

不是'&&'而不是'&'? – jww

+6

@jww'&&'如果第一個命令失敗將失敗,'&'將不管執行第二個命令。 – YoYoYonnY

156

使用&適用於短命令,但該單行可以非常快地很長。發生這種情況時,請切換到多行語法。

FOR /r %%X IN (*.txt) DO (
    ECHO %%X 
    DEL %%X 
) 

()事項安置。 DO後的圓括號必須放在同一行,否則批處理文件將不正確。詳情請參閱if /?|find /V ""

+11

該解決方案看起來乾淨可讀。我也會警告任何使用這種解決方案的程序員,DO之後的圓括號不能放在下一行,否則它會壓縮批處理文件。在我編寫for循環的代碼中,我通常將大括號'{'下一行。 –

+2

另外 - 如果你的任何嵌套命令有括號(例如,「回聲東西的東西(別的東西)」編輯:啊,請參閱bk1e的答案:) –

27

SilverSkin和Anders都是正確的。您可以使用圓括號執行多個命令。但是,您必須確保命令本身(及其參數)不包含括號。 cmd貪婪地搜索第一個右括號,而不是正確地處理嵌套括號。這可能導致命令行的其餘部分無法解析,或者可能導致一些括號傳遞給命令(例如DEL myfile.txt))。

解決方法是將循環的主體分成一個單獨的函數。請注意,您可能需要跳過函數體以避免「進入」它。

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X 
REM Don't "fall through" to :loopbody. 
GOTO :EOF 

:loopbody 
ECHO %1 
DEL %1 
GOTO :EOF 
+1

雖然我們在這個話題上,%X是在處理文件名時永遠不要糾正,總是使用「%〜X」(在你的例子中,你可能會忽略在子函數中使用%*) – Anders

+1

這是一個很好的觀點。演示這兩個問題的路徑的一個很好的例子是'C:\ Program Files(x86)'。 – bk1e