2011-04-06 84 views
2

我寫了一個簡單的批處理腳本來遍歷特定目錄中的文件,並將一些文本(客戶端名稱)添加到文件名中。劇本工作正常;但是,目錄中最近修改的文件似乎要修改兩次。我嘗試了兩種解決此問題的方法 - 使用pushd作爲目錄並列出for循環中的完整路徑(以下各代碼)。在Windows批處理文件中多次處理文件For ... Loop。爲什麼?

兩個辦法我結束了類似下面(假定第三個文件是最近修改的文件):

原始文件名:

SomeFile1.rtf 
SomeFile2.rtf 
SomeFile3.rtf 

重命名的文件名:

TextToPrepend_SomeFile1.rtf 
TextToPrepend_SomeFile1.rtf 
TextToPrepend_TextToPrepend_SomeFile1.rtf 

不,這不是第三個文件的拼寫錯誤。它被第二次處理並且TextToPrepend被第二次預先佔用。我對Windows批處理腳本相當陌生,並且我嘗試過研究這個問題,但是找不到這樣做的原因。任何幫助表示讚賞。

代碼:

pushd C:\Images\Data\ 

rem setlocal ENABLEDELAYEDEXPANSION 

for %%X in (*.rtf) do ( 
    ren "%%X" TEXTTOPREPEND_"%%X" 
) 

popd 

- 和 -

rem setlocal ENABLEDELAYEDEXPANSION 

for %%X in (C:\Images\Data\\*.rtf) do ( 
    ren "%%X" TEXTTOPREPEND_"%%~nX".rtf 
) 

如果它可以幫助任何的批處理腳本正在對Windows Server 2008的機器上執行。

+0

我不能從Windows 7重現此我(* .RTF)用於%X做仁%×AppendText_%不帶X發生「雙重命名」。 – tamarintech 2011-04-06 17:16:56

+0

我確實設法重現它。見ikegami的答案。 – tamarintech 2011-04-06 17:33:48

+0

我**可以在win7上重現這個:'echo a> 00.rtf;回聲a> 01.rtf; (* .rtf)do(ren %% i a _ %% i)'中的%% i。 00.rtf被重命名兩次。 – Mat 2011-04-06 17:34:57

回答

4

你顯然錯誤地認爲glob在循環開始之前展開。我知道它不在DOS中。解決方案:

for %%X in (*.rtf) do (
    ren "%%X" "TEXTTOAPPEND_%%~nX._rtf" 
) 
ren *._rtf *.rtf 

md tmp 
for %%X in (*.rtf) do (
    move "%%X" "TEXTTOAPPEND_%%~nX.rtf" 
) 
move tmp\* . 
rd tmp 

不就在此刻我的Windows中,所以無法測試,看看我可以複製你的行爲。

+0

謝謝你的迴應。我試過ikegami的解決方案,我仍然得到雙重命名。我向該目錄添加了一個新文件,現在它正在對該文件執行雙重命名。它似乎是最近修改過的文件。我添加了回聲以查看它發生的位置,並且正在重命名的文件始終在循環中首尾處理。 – Erik 2011-04-06 18:00:23

+0

@Erik,哎呀! 'foo.rtf_'也被稱爲'foo〜1.rtf',所以'foo.rtf_'匹配'* .rtf'。我調整了我的解決方案。 – ikegami 2011-04-06 18:06:29

+0

您的新方法有效,我非常感謝您的協助。要添加一個額外的問題,因爲我現在正在重命名文件,我的popd命令不起作用。我假設是因爲重命名爲文件所需的時間。我有迴應,並且我看到它回到主目錄的位置,但重命名完成後,它會「push」回到我在pushd命令中列出的目錄。該腳本每天平均處理和重命名約2,000個文件。重命名執行時有沒有辦法停止腳本? – Erik 2011-04-06 18:51:53

3

這似乎這樣的伎倆用更少的代碼:

for /f "delims=" %%X in ('dir /b *.rtf') do ren "%%X" TEXTTOPREPEND_"%%X" 
+0

+1,它是安全的,因爲輸出在ren執行之前被完全緩存......甚至開始 – jeb 2011-04-06 19:58:20