条件批量重命名(Windows XP中)

问题描述:

我有几百个文件,其名称在结尾处连续指数:条件批量重命名(Windows XP中)

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

我需要使得指数开始在976(不是1)重命名它们和前导0变成 '1' 时的指标达到1000

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.jpg,recipes1001.jpg等我做错了什么?

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

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

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

为什么使用这样奇怪的语法?为什么不按照帮助中的建议('if /?')编写')else(')? – aschipfl

+0

我写这样的唯一原因是个人喜好。这个想法来自在写入流重定向之前或之后一个命令,我更喜欢在命令之后写入流重定向,所以我不必通过文本行来看看哪个命令正在被使用,我可能会有一些奇怪的偏好,但它只是一个偏好。 – treintje

+0

我不明白这个'else'语法是如何链接到重定向的,但无论如何这都是您的偏好,所以对我来说很好...... ;-) – aschipfl

这是我会做这样的方式:

@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 
+0

另一个优雅的解决方案,谢谢。对于那些不知道的人来说,':〜1'部分通过选择位置为1或更大的所有元素(第一个元素具有位置0,第二个1等等)来构建原始“10975”字符串的子字符串。 。 – Rokas