2012-04-24 111 views
3

如何批量重命名包含子文件夾和文件的文件夾A中的文件,格式名爲filename_ex.doc,並使它們看起來像filename.doc?cmd批量重命名子文件夾/文件

我一直在嘗試做一段時間,這是一個史詩般的失敗。請幫忙。

+0

@MartinJames每當我試圖一批「編程」,我失敗瞭如此巨大,我永遠會期間發佈任何代碼片段我公司開發的這些步驟;-) – 2012-04-24 07:28:56

+0

我已經試過FOR/F, FOR/D所有這些東西,並從這裏閱讀文件:[鏈接](http://ss64.com/nt/for.html)。目前爲止沒有像樣的結果...... :(我真的很討厭windows批量編程。 – Alex 2012-04-24 08:05:16

+0

@MartinJames:也嘗試從命令行:'for「tokens = 1-3 delims = _」。%a('dir * _ex.ext ')做回聲%a_%b。%c' ...這是得到卡住,如果我有文件夾/子文件夾或其他文件包含字符的路徑:「。」和「_」 – Alex 2012-04-24 08:15:54

回答

3

我認爲你還想重命名子文件夾中的文件,這也是你對馬丁詹姆斯的第二條評論中的方向有問題的地方。我猜你用DIR/S選項試過了這個代碼。但是你非常接近:-)你只需要使用2個循環!

編輯 - 固定代碼一旦輸出相貌端正,降ECHO,使其功能。

@echo off 
for /r %%D in (.) do (
    pushd "%%~fD" 
    for /f "tokens=1-3 delims=_." %%A in ('dir /b *_ex.ext 2^>nul') do echo ren "%%A_%%B.%%C" "%%A.%%C" 
    popd 
) 

以上將工作,只要每個文件名沒有比出現在_ex.ext任何_.等。路徑中的字符不應該是任何問題,只是文件名是一個問題。

下面是一個更強大的解決方案,應該可以處理任何文件名(unicode名稱除外)。它也快得多。它使用子字符串操作,並且必須知道要從名稱中刪除的字符數。在你的例子中它是3個字符。再次,刪除ECHO一旦結果命令看起來正確。

@echo off 
setlocal disableDelayedExpansion 
for /f "delims=" %%F in ('dir /b /s *_ex.ext') do (
    set "old=%%F" 
    set "new=%%~nF" 
    setlocal enableDelayedExpansion 
    echo ren "!old!" "!new:~0,-3!.ext" 
    endlocal 
) 
+0

如果你有下劃線在子文件夾和文件名的名稱中? – Alex 2012-04-24 14:53:25

+0

我測試過了,它不起作用,但是我會檢查什麼是錯的。謝謝 – Alex 2012-04-24 15:08:11

+0

@Alex - 我會說它沒有用,我修正了2個bug,並增加了一個更強大和更快的替代方案 – dbenham 2012-04-25 00:59:27