2012-07-31 45 views
2

我正在使用批處理文件追加多個文件名。文件名不止一次附加

對於文件:的1.txt,2.txt,3.txt,4.txt,5.txt - 我想用copy_1.txt

set "nname=copy_" 

for %%A in (*.txt) do (
ren %%A %nname%%%A 
) 
exit 

但是追加,循環出現環回到第一個文件並重新附加文件名。

這裏是CMD輸出:

> for %A in (*.txt) do (ren %A copy_%A) 
> (ren 1.txt copy_1.txt) 
> (ren 2.txt copy_2.txt) 
> (ren 3.txt copy_3.txt) 
> (ren 4.txt copy_4.txt) 
> (ren 5.txt copy_5.txt) 
> (ren copy_1.txt copy_copy_1.txt) 

可爲什麼這是發生有人向我解釋,可以如何avaoid這個問題呢?

我試圖添加一個「異常處理程序」,但它沒有用。

set "nname=copy_" 

for %%A in (*.txt) do (
if exist %nname%%%A goto :exit 
ren %%A %nname%%%A 
) 
:exit 
echo file exists 

在此先感謝!

回答

1

shell在開始處理重命名命令之前未完成其文件列表,因此第一個重命名命令的結果(即copy_1.txt)與* .txt匹配。

的一種方式,以避免它:

for /F "usebackq" %%A in (`dir /b *.txt`) do (ren %%A %nname%%A) 
+0

謝謝!它效果很好,比我做的臨時文件夾工作要好得多。要明確一點,通過使用「usebackq」函數,在執行shell之前完成* .txt的循環之前? – 2012-07-31 18:32:02

+0

/F選項允許您將命令的輸出用作「for」命令的「輸入」。 「usebackq」選項只是簡單地改變它是一個''字符串還是一個被視爲要執行的命令的字符串。 (最好添加「usebackq」選項並將你的命令放在''中)。接下來會發生的事情是shell將''作爲命令處理文本中的文本,執行該命令,然後從該命令中獲取輸出(來自命令的stdout)並逐行處理它。每行都以空格字符分割爲標記,並將標記分配給for變量。 – 2012-08-01 14:58:55

+0

在循環中,只有一個變量%% A,因此只有輸出每行上的第一個標記被分配給%% A。但是'dir/b * .txt'完全可以輸出你想要的結果:每個文件只有一行,只有文件名。在「for」循環開始執行之前完成「dir ...」這一事實只是一個虛擬的shell - 我直到測試它時才確定。 – 2012-08-01 15:00:03