cmd批量重命名子文件夹/文件

问题描述:

如何批量重命名包含子文件夹和文件的文件夹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

我认为你还想重命名子文件夹中的文件,这也是你对马丁詹姆斯的第二条评论中的方向有问题的地方。我猜你用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