条件批量重命名 (Windows XP)

Conditional batch rename (Windows XP)

我有数百个文件,其名称末尾有一个顺序索引:

recipes0001.jpg
recipes0002.jpg
...
recipes0283.jpg

我需要重命名它们,以便索引从 976(而不是 1)开始,当索引达到 1000 时,前导 0 变为“1”

recipes0976.jpg
recipes0977.jpg
...
recipes1000.jpg
recipes1001.jpg
....

我写了这个批处理代码(来自here的修改答案):

@echo off
setlocal EnableDelayedExpansion
set i=975
for %%a in (*.jpg) do (
    set /a i+=1
    if i lss 1000 ren "%%a" "recipes0!i!.new"
    if i geq 1000 ren "%%a" "recipes!i!.new"
)
ren *.new *.jpg

似乎代码总是运行没有前导 0 的部分,因为我不断得到 recipes976.jpgrecipes1001.jpg 等。我做错了什么?

作为后续问题,两个 if 可以合并为一个 if...else 吗?

要比较变量i的值,传递给if命令时需要展开

if !i! lss 1000 (
  ren "%%a" "recipes0!i!.new"
)^
else (
  ren "%%a" "recipes!i!.new"
)

我会这样做:

@echo off
setlocal EnableDelayedExpansion
set i=10975
for %%a in (*.jpg) do (
    set /a i+=1
    ren "%%a" "recipes!i:~1!.new"
)
ren *.new *.jpg