2013-05-10 137 views
0

我有幾個文件夾,其中包含具有雙重文件擴展名和常規文件擴展名的文件。我需要創建批處理腳本來搜索所有文件夾,並使用任何具有雙擴展名的文件刪除最後一個擴展。沒有任何文件擴展名是一致的。批處理文件查找具有雙重文件擴展名的文件並刪除最後一個文件

Here's an example 

C:\test\regular.exe 
C:\test\picture.jpg.doc 
C:\newtest\document.doc.pdf 

End Result I need 

C:\test\regular.exe 
C:\test\picture.jpg 
C:\newtest\document.doc 

回答

1
@ECHO OFF 
SETLOCAL 

SET sourcedir=c:\sourcedir 
FOR /r "%sourcedir%" %%i IN (*.*) DO (
FOR %%n IN ("%%~ni") DO IF NOT "%%~xn"=="" IF NOT EXIST "%%~dpni" ECHO REN "%%~fi" "%%~ni" 
FOR %%n IN ("%%~ni") DO IF NOT "%%~xn"=="" IF EXIST "%%~dpni" ECHO CAN NOT REN "%%~fi" "%%~ni" 
) 

GOTO :EOF 

這批應該完成任務。

對於樹中根據sourcedir的每個文件,如果文件本身的NAME包含「擴展名」,並且沒有原始擴展名的文件名不存在,則重命名該文件。這樣,如果找到...picture.jpg.doc,則只有當...picture.jpg不存在時才應進行重命名。

重命名的命令只是ECHO ed。您需要刪除ECHO關鍵字來激活重命名 - 在驗證那是你想要做的。

我已經添加了第二行來報告重命名無法完成,因爲現有的文件..這可以做得稍微好一點,但它會工作。


修改爲修改名稱以防萬一簡單重命名無法完成。

注意 - 此版本將立即重命名 - 沒有ECHO es首先提供列表,因爲重命名文件時提供此類列表可能會在主重命名運行中產生不同結果,這是無稽之談。

@ECHO OFF 
SETLOCAL 

SET sourcedir=c:\sourcedir 
FOR /r "%sourcedir%" %%i IN (*.*) DO (
FOR %%n IN ("%%~ni") DO IF NOT "%%~xn"=="" IF EXIST "%%~dpni" (
    SET renreq=Y 
    FOR %%a IN (new alt extra another 1 2 3 4 5 6 7 8 9) DO IF DEFINED renreq (
    IF NOT EXIST "%%~dpi%%~nn_%%a%%~xn" (
    REN "%%~fi" "%%~nn_%%a%%~xn" 
    SET "renreq=" 
    ) 
) 
    IF DEFINED renreq ECHO CAN NOT REN "%%~fi" 
) ELSE (
REN "%%~fi" "%%~ni" 
) 
) 

GOTO :EOF 

合理的是,如果需要,可以擴展「附加」的列表。

+0

哇!完美的作品!謝謝!你是救命的人:) – Brian 2013-05-10 17:04:41

+0

我有幾個例子,它不能重命名文件,因爲已經存在一個文件。在這些情況下,是否有辦法將其重命名爲其他內容?例如:文件filename.doc已經存在,並且批處理文件試圖重命名filename.doc.sh有沒有辦法將它重命名爲filename_new.doc?我嘗試了一些東西,但我的語法不正確。 – Brian 2013-05-10 20:06:18

1

試試這個,取出echo,如果輸出是OK:

@echo off &setlocal 
for /r \ %%i in (*) do (
    for %%j in ("%%~ni") do if "%%~xj" neq "" echo ren "%%~fi" "%%~nj" 
) 

編輯:增加了對整個高清支持。

+0

哦 - 太近了!但是目的地名稱應該是'%%〜ni'或'%%〜nj'(它們應該是相同的) - '%%〜Fj'會產生一個語法錯誤,'REN'(但應該用'MOVE' ') – Magoo 2013-05-10 17:13:45

+1

@Peter - 噢,我總是忘記這個'ren to full name syntax error':)'。 – Endoro 2013-05-10 17:21:31

相關問題