如何使用批处理脚本重命名多个文件

时间:2018-08-23 20:15:37

标签: windows batch-file for-loop

我正在尝试重命名目录中的所有xml文件。我尝试了以下方法:

@echo off & setlocal EnableDelayedExpansion

set a=1
for /f "delims=" %%i in ('/PolicyDL/*.xml') do (
  set "name=%%F"
  ren "!name!" "!a!.xml"
set /a a+=1
)

但是,我收到以下错误:

The System Cannot find the Path Specified.

PolicyDL是与脚本位于同一目录的目录。

请帮助!

2 个答案:

答案 0 :(得分:0)

这应该做到:

@echo off
setlocal enableDelayedExpansion
set a=1
for %%F in ("PolicyDL\*.xml") do (
  set "name=%%F"
  ren "!name!" "!a!.xml"
  set /a a+=1
)

我认为它只是想要\而不是/,我将其更改为双引号以包装路径/文件。

答案 1 :(得分:0)

有一些问题:

  • Windows路径分隔符为\/通常表示命令选项;
  • 我假设目录PolicyDL是当前目录的子目录;如果要指向批处理文件所在的目录,请在下面的代码中将前缀.\替换为%~dp0
  • for /F尝试将''之间的部分作为命令执行;我建议在这里使用dir /B /A:-D; (相反,您可以使用不带for的普通/F循环,但是在这种特殊情况下,某些文件可能会尝试重命名两次,因为for不会列举整个匹配文件集在开始处理它们之前...)
  • 返回文件的排序顺序取决于文件系统(除非您按dir进行某种排序,例如/O:N按名称进行排序,或/O:D按年龄进行排序,例如);
  • 在读取for之类的%%i元变量的过程中启用延迟扩展会引起感叹号的问题;切换延迟扩展,以便仅在确实需要时才启用;

这是我的编码建议:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set /A "a=1"
for /F "delims=" %%i in ('dir /B /A:-D /O:N ".\PolicyDL\*.xml"') do (
    set "name=%%F"
    setlocal EnableDelayedExpansion
    ren "!name!" "!a!.xml"
    endlocal
    set /A "a+=1"
)