批处理文件查找具有双重文件扩展名的文件并删除最后一个文件

问题描述:

我有几个文件夹,其中包含具有双重文件扩展名和常规文件扩展名的文件。我需要创建批处理脚本来搜索所有文件夹,并使用任何具有双扩展名的文件删除最后一个扩展。没有任何文件扩展名是一致的。批处理文件查找具有双重文件扩展名的文件并删除最后一个文件

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 

@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

试试这个,取出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