以下是我的建议:
但是请注意,该示例不适合目录中已经匹配 fb<num><num><num>.EPL 的任何现有文件名,因此这些文件名也将被重命名为可能的新数字。
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "SourceDir=."
Set "FileGlob=*.EPL"
Set "Prefix=fb"
Set "FileNum=1000"
For /F Delims^= %%G In ('(Set PATHEXT^=^) ^& "%SystemRoot%\System32\where.exe"
/F "%SourceDir%":"%FileGlob%" 2^> NUL') Do (Set /A FileNum += 1
SetLocal EnableDelayedExpansion & Ren %%G "%Prefix%!FileNum:~-3!%%~xG"
EndLocal)
- 在
= 和关闭" 之间插入所需的源目录3,(根据您的示例,我已将. 用于当前目录,但您可以使用绝对路径或其他需要的相对路径)。
- 在
4 的= 和关闭" 之间插入所需的文件全局前缀字符串,(我使用*.EPL 来匹配您的示例)。
- 在
5 行的= 和关闭" 之间插入您所需的文件名前缀字符串,(我使用fb 来匹配您的示例)。
我使用1000 作为您的起始文件编号,因为Set /A 使用整数,并且将多个并发0 视为0。添加1 将防止这种情况发生,并且当变量扩展仅使用最后三个字符时将被省略。我还对其进行了调整,使文件编号以fb001.EPL 开头,以匹配您的问题参数,(您的代码以fb000.EPL 开始序列)。
我在循环中启用了延迟扩展,因为在同一个带括号的代码块中修改和使用变量时,它是必需的。通常不应为整个脚本启用它,因为包含! 字符的文件名和字符串可能会受到影响,(这些字符将被省略)。
我还使用where.exe 在文件选择中使用了“带和大括号”。此实用程序不受使用 8.3 命名的 Windows 影响,虽然您提供的示例可能不是问题,但它将完全匹配扩展名 .EPL,而不是那些以 .EPL 开头的扩展名。标准的For 循环、(您使用的),以及更常用的Dir 命令都受 8.3 命名的影响。
为了提高稳定性,我使用了where.exe 的完整路径和系统环境变量%SystemRoot%,以防止依赖%Path% 变量,该变量经常因最终用户的错误或意外修改而损坏。
作为您自己代码的直接解决方案,无需修改大部分代码:
setlocal ENABLEDELAYEDEXPANSION
set /a fileNum = 1
set fileNum=1000%fileNum%
for %%f in (*.EPL) do (
ren "%%f" fb!fileNum:~-3!%%~xf
set /a fileNum += 1
)
但是,我必须添加,因为您的示例代码使用标准的 for 循环,您可能会遇到问题。问题是您的循环会将第一个文件传递给do 部分,同时它仍在解析所有包含* glob 下的其他文件。这意味着fb001.EPL 将被放回列表中进行解析,并且可以再次被拾取以进行下一次处理,这也可以继续用于其他文件!