2012-01-28 174 views
10

我有一個命令行其複製文件夾,從A到文件夾B:Windows命令行上的Foreach循環?

copy A\* B\ 

我現在想刪除B中都存在的所有文件,非遞歸。我可以列出該文件放置在這樣的:

dir /b /a-d A 

隨着輸出是:

f0.txt 
f1.txt 
f2.txt 

這裏是我想要做什麼的僞代碼:

foreach $1 in <dir /b /a-d A output>: 
    del B\$1 

有一個windows命令行語法,將執行一個命令,使用另一個命令的輸出作爲輸入?我知道管道操作員(|),但不知道這可以用來完成這項任務的方式。任何幫助將不勝感激。

限制:只有在Windows命令默認提供7

回答

12

您可以將文件迭代與

for %x in (*) do ... 

這也是很多比試圖遍歷一個命令的輸出更強勁這個用例。

所以

for %f in (A\*) do del "B\%~nxf" 

,或者,如果你需要這個批處理文件,而不是命令行:只

for %%f in (A\*) do del "B\%%~nxf" 

%~nxf返回文件名和每個文件的擴展名,因爲這將是前綴爲A\,並且您想要在B中將其刪除。

添加> nul 2>&1以抑制任何輸出(當喲出現錯誤消息時你嘗試刪除不存在的文件)。


只是爲了保持完整性,你其實可以遍歷一個命令的輸出幾乎相同的方式:

for /f %x in ('some command') do ... 

但有幾個問題,這樣做的,在迭代的情況下, dir輸出它很少需要,因此我不推薦它。


而且因爲你使用的是Windows 7,你有PowerShell的還有:

Get-ChildItem A\* | ForEach-Object { Remove-Item ('B\' + $_.Name) } 

或更短:

ls A\* | % { rm B\$($_.Name) } 
+1

您可以添加'-ErrorAction Silentlycontinue',以避免在錯誤A中的某個文件不存在於B中 – mjsr 2012-01-28 19:53:11