条件批量重命名(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"
)
答
这是我会做这样的方式:
@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
为什么使用这样奇怪的语法?为什么不按照帮助中的建议('if /?')编写')else(')? – aschipfl
我写这样的唯一原因是个人喜好。这个想法来自在写入流重定向之前或之后一个命令,我更喜欢在命令之后写入流重定向,所以我不必通过文本行来看看哪个命令正在被使用,我可能会有一些奇怪的偏好,但它只是一个偏好。 – treintje
我不明白这个'else'语法是如何链接到重定向的,但无论如何这都是您的偏好,所以对我来说很好...... ;-) – aschipfl