【问题标题】:Batch rename to numeric names with leading zeroes批量重命名为带前导零的数字名称
【发布时间】:2021-05-10 18:24:37
【问题描述】:

所以我正在尝试编写一个将 <randomname>.EPL 重命名为 fbXYZ.EPL 的批处理(XYZ - 带前导零的数字)

所以像bes_rush.EPL 这样的东西应该变成fb001.EPL 并且其他文件也应该被重命名(fb002.EPLfb003.EPL 等)

这是我目前所拥有的

setlocal ENABLEDELAYEDEXPANSION
set/a fileNum = 0
set fileNum=0000%fileNum%
set fileNum=%fileNum:~-3%

for %%f in (*.EPL) do (
  ren %%~nf%%~xf fb!fileNum!%%~xf
  set/a fileNum += 1
)

我可以用数字重命名它,它确实有效,但我根本无法添加前导零, 我的所有尝试都导致它只重命名一个文件并保留其余文件

【问题讨论】:

  • 大多数人使用###来表示数字格式。

标签: batch-file rename batch-rename


【解决方案1】:

以下是我的建议:

但是请注意,该示例不适合目录中已经匹配 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 将被放回列表中进行解析,并且可以再次被拾取以进行下一次处理,这也可以继续用于其他文件!

【讨论】:

    【解决方案2】:
    @ECHO Off
    SETLOCAL ENABLEDELAYEDEXPANSION
    rem The following settings for the source directory, destination directory, target directory,
    rem batch directory, filenames, output filename and temporary filename [if shown] are names
    rem that I use for testing and deliberately include names which include spaces to make sure
    rem that the process works using such names. These will need to be changed to suit your situation.
    
    SET "sourcedir=u:\your files\t w o"
    SET /a filenumber=1001
    
    FOR /f "delims=" %%b IN ('dir /b /a-d "%sourcedir%\*.epl" ' ) DO (
     SET "originalfilename=%%~nb"
     SET "notnumber=Y"
     rem do not rename files "fb999"
     IF /i "!originalfilename:~0,2!!originalfilename:~5!" == "fb" IF "!originalfilename:~4!" neq "" CALL :isnum !originalfilename:~2,3!
     IF defined notnumber (
      CALL :nextvalidnum
      IF NOT DEFINED filenumber ECHO Fail - no available fb999&GOTO :EOF 
      REN "%sourcedir%\%%b" "fb!filenumber:~-3!.epl"
     )
    )
    GOTO :EOF
    
    :: Determine whether %1 is purely numeric
    :isnum
    SET "notnumber=9%1"
    FOR /l %%z IN (0,1,9) DO CALL SET "notnumber=%%notnumber:%%z=%%"
    GOTO :eof
    
    :: set filenumber to next valid fb(1)999 or empty if not available
    :nextvalidnum
    IF %filenumber% gtr 1999 SET "filenumber="&GOTO :EOF 
    IF EXIST "%sourcedir%\fb%filenumber:~-3%.epl" SET /a filenumber+=1&GOTO nextvalidnum
    IF %filenumber% gtr 1999 SET "filenumber="
    GOTO :eof
    

    最初将filenumber 设置为1001,期望使用最后4 个字符作为新的fb999 名称。

    读取每个.epl 名称,仅处理那些 名称为fb999 的文件。这是通过记住字符串中的第一个字符是“字符 0”来完成的;检测名称的前 2 个字符是 fb,除了第五个字符之外没有字符,文件名中的第四个字符存在并且三个字符从字符 2 开始都是数字。如果作为 %1 提供的值是全数字的,则例程“isnum”将 notnumber 设置为 undefined,否则设置为 已定义

    如果定义了notnumber,文件名将被处理。如果文件fb+last 3 characters of "filenumber".epl 存在,则通过增加filenumber 来检测下一个有效数字。如果filenumber 超过1999,则没有可用号码。所以清除filenumber 并将其用作显示消息并退出的标志。

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      相关资源
      最近更新 更多