Batch file 条件批量重命名(Windows XP)

Batch file 条件批量重命名(Windows XP),batch-file,if-statement,windows-xp,batch-rename,Batch File,If Statement,Windows Xp,Batch Rename,我有几百个文件,其名称末尾有一个顺序索引: recipes0001.jpg recipes0002.jpg ... recipes0283.jpg 我需要重命名它们,以便索引从976(不是1)开始,当索引达到1000时,前导0变成“1” recipes0976.jpg recipes0977.jpg ... recipes1000.jpg recipes1001.jpg .... 我已编写了此批处理代码(修改后的答案): 似乎代码总是在没有前导0的情况下运行部件,因为我一直得到recipes

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

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

recipes0976.jpg
recipes0977.jpg
...
recipes1000.jpg
recipes1001.jpg
....
我已编写了此批处理代码(修改后的答案):

似乎代码总是在没有前导0的情况下运行部件,因为我一直得到
recipes976.jpg
recipes1001.jpg
等等。我做错了什么


作为后续问题,两个
if
是否可以组合成一个
if
..
其他

要比较变量
i
的值,需要在将其传递给
if
命令时对其进行扩展

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

要比较变量
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

我会这样做:

@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

另一个优雅的解决方案,谢谢。对于那些不知道的人,
:~1
部分通过选择位置为1或更大的所有元素(第一个元素的位置为0,第二个元素的位置为1,等等)来构建原始
10975
字符串的子字符串。另一个优雅的解决方案,谢谢。对于那些不知道的人来说,
:~1
部分通过选择位置为1或更大的所有元素(第一个元素的位置为0,第二个元素的位置为1,等等)来构建原始
10975
字符串的子字符串。为什么要使用这种奇怪的语法?为什么不按照帮助中的建议将
)else(
写入一行(请参见
if/?
)?我这样写的唯一原因是个人偏好。这个想法来自于在命令之前或之后写流重定向。我更喜欢在命令之后写流重定向,所以我不必通读文本行来查看正在使用哪个命令。我可能有点奇怪的偏好,但这只是一个偏好。我不明白这个
else
语法是如何链接到重定向的,但这是您的偏好,所以对我来说没关系…;-)为什么要使用这种奇怪的语法?为什么不按照帮助中的建议将
)else(
写入一行(请参见
if/?
)?我这样写的唯一原因是个人偏好。这个想法来自于在命令之前或之后写流重定向。我更喜欢在命令之后写流重定向,所以我不必通读文本行来查看正在使用哪个命令。我可能有点奇怪的偏好,但这只是一个偏好。我不明白这个
else
语法是如何链接到重定向的,但这是您的偏好,所以对我来说没问题…;-)