【问题标题】:Conditional batch rename (Windows XP)有条件的批量重命名 (Windows XP)
【发布时间】:2017-10-26 10:04:13
【问题描述】:

我有数百个文件,它们的名称在末尾有一个顺序索引:

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吗?

【问题讨论】:

    标签: batch-file if-statement windows-xp batch-rename


    【解决方案1】:

    我会这样做:

    @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 字符串的子字符串。
    【解决方案2】:

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

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

    【讨论】:

    • 为什么要使用这种奇怪的语法?为什么不按照帮助中的建议将) else ( 写入一行(参见if /?)?
    • 我这样写的唯一原因是个人喜好。这个想法来自于在命令之前或之后编写流重定向。我更喜欢在命令之后写流重定向,所以我不必通读文本行来查看正在使用的命令。我可能有一些奇怪的偏好,但这只是一种偏好。
    • 我不明白 else 语法是如何与重定向相关联的,但无论如何这是您的偏好,所以对我来说没问题... ;-)
    猜你喜欢
    • 2010-09-08
    • 2019-01-25
    • 2013-07-13
    • 2015-12-03
    • 2014-07-01
    • 2013-12-19
    • 2017-04-20
    • 2012-12-10
    相关资源
    最近更新 更多