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

3

如何批量重命名文件夹A中包含子文件夹和以filename_ex.doc格式命名的文件,使它们变成filename.doc的格式?

我一直尝试着做这件事情,但一直失败。请帮忙解决。


@MartinJames 每当我尝试批处理“编程”时,我总是失败得如此惨重,以至于我永远不会发布我在这些步骤中开发的任何代码片段;-) - Uwe Keim
我已经尝试了FOR /F,FOR /D等所有方法,并阅读了这里的文档:链接。到目前为止没有什么好的结果... :( 我真的很讨厌Windows批处理编程。 - Alex
@MartinJames:我也尝试了命令行:for "tokens=1-3 delims=_." %a ('dir *_ex.ext') do echo %a_%b.%c ... 如果我的路径中包含字符“.”和“_”,这个命令就会卡住,因为它会搜索文件夹/子文件夹或其他文件。 - Alex
1个回答

3

我猜您想要同时重命名子文件夹中的文件,这也是您在评论Martin James时遇到方向问题的地方。我猜您尝试使用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
)

如果子文件夹和文件名中有下划线,这个方法还能正常工作吗? - Alex
我已经测试过了。它不起作用,但我会检查出了什么问题。谢谢。 - Alex
@Alex - 我会说它没有起作用。我修复了两个错误,并添加了一个更强大和更快的替代方案。 - dbenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接