批处理:使用输入字符串重命名多个文件

时间:2012-08-17 07:33:08

标签: batch-file batch-rename

我试图在用户输入要从文件名中删除的字符串后重命名文件。这工作正常,除非我想重命名与脚本位于不同位置的文件:

如果我没有具体说明文件路径(例如删除C:\DATABASE\*.* /s

,到目前为止,这是我的工作
SET /P X=Type in the String that you want to remove and then press ENTER: 

set deletestring=%X%
for /f "delims==" %%F in ('dir C:\DATABASE\*.* /s /b ^| find "%deletestring%"') do (
    set oldfilename=%%F
    set newfilename=!oldfilename:%deletestring%=!
    Ren "!oldfilename!" "!newfilename!"
    )

谢谢!

1 个答案:

答案 0 :(得分:0)

您遇到的主要问题是REN的第一个参数可以接受完整路径信息,但第二个参数只能包含没有路径信息的新名称。您可以使用~nx修饰符从FOR / F命令报告的完整路径中提取名称和扩展名。

您的FOR / F选项不可靠 - 如果文件名包含=,它将会中断。你想要将delims设置为空。

这个问题实际上比它看起来更复杂。您的代码将尝试重命名文件和目录。如果要重命名目录,则必须以反向alpha顺序重命名,因为在重命名任何内容之前都会构建整个列表。如果以正常的alpha顺序处理并重命名目录,则找不到该目录中的后续条目。

IN()子句中的FIND过滤器不是必需的。理想情况下,您的过滤器应仅匹配文件或目录名称,而不是路径。这是可行的,但有点棘手。我只是跳过IN()子句中的过滤,并在DO子句中进行。

文件或目录名称可以包含!个字符。但如果FOR变量扩展包含!并且启用了延迟扩展,则它将被破坏。通过在循环内切换延迟扩展开启和关闭可以避免这个问题。

可以通过搜索和替换删除整个名称,但不能将文件重命名为空。所以我添加了一个测试,以确保剩下一个名字。

setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b ^| sort /r') do (
  set "old=%%F"
  set "file=%%~nxF"
  setlocal enableDelayedExpansion
  set "new=!file:%X%=!"
  if defined new if !new! neq !file! ren "!old!" "!new!"
  endlocal
)

如果您不想重命名目录,则需要添加/ A-D选项。我首先想到你可以使用FOR / R语句,但这可能会导致同一文件重命名两次。 FOR / F在处理任何文件之前缓冲整个结果集,但FOR / R不会。

setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b /a-d') do (
  set "old=%%F"
  set "file=%%~nxF"
  setlocal enableDelayedExpansion
  set "new=!file:%X%=!"
  if defined new if !new! neq !file! ren "!old!" "!new!"
  endlocal
)