【问题标题】:Batch File If statement inside For loopFor循环内的批处理文件If语句
【发布时间】:2012-07-30 12:23:31
【问题描述】:

我遇到的问题是我的 if 语句(在 for 循环内)似乎不配合。我想要做的是:

  • 遍历一堆 zip 文件并将它们重命名为 005.zip、006.zip、007.zip 等。
  • 我保留了一个计数器,从 5 开始确定文件编号,以及一个前缀 00,以便获得 005、006 等。
  • 一旦计数器达到 10,我希望前缀为 0 而不是 00。所以当计数器为 10 时,该文件将命名为 010.zip,然后是 011.zip,而不是 0010.zip、0011。拉链等。

这是我目前所拥有的:

setlocal enableextensions enabledelayedexpansion
SET /a COUNT=5
SET FILE_PREFIX=00
SET /a MAX=10
for %%f in (*.zip) do  (
   if !COUNT! == !MAX! (set FILE_PREFIX=0)
   ren "%%f" %FILE_PREFIX%!COUNT!.zip
   set /a COUNT+=1
   echo !COUNT!
)
endlocal

为什么 if 语句不起作用?文件重命名工作正常,只是 if 语句不会将 FILE_PREFIX 更改为 0。

【问题讨论】:

  • 如果对我有用。你确定你已经发布了你正在运行的非常准确的代码吗?
  • 是的,它绝对是相同的代码..我仔细检查并再次运行它,我仍然得到名为 0010.zip、0011.zip 等的文件。
  • 哦,我明白了问题所在。您不会对 FILE_PREFIX 应用延迟扩展。是我没有复制非常精确的代码。对不起。编辑了我的答案。

标签: if-statement batch-file for-loop


【解决方案1】:

问题是您的代码没有对 FILE_PREFIX 应用延迟扩展,因此该值仅在循环中计算一次,在解析时;而不是在运行时每次迭代都刷新。

只需将您的线路更改为

ren "%%f" !FILE_PREFIX!!COUNT!.zip

并且presto!它应该可以工作。

但是一旦你更正它,你的方法对于 999 以上的数字仍然会失败。

要获得更强大的实现,请尝试此替代方法

SET /a count=1
for %%f in (*.zip) do  (
  set fn=0000!count!
  echo REN "%%f" !fn:~-4!%%~xf
  set /a count+=1
)

循环内部

  1. 代码0000!count! 将一些零(在本例中为4)附加到数字;所以它将遵循序列 00001, 00002, ... 00009, 000010, 000011, ...

  2. 然后!fn:~-4! 删除除最后一个 N(本例中为 4)之外的所有数字。所以它将遵循所需的序列 0001, 0002, ... 0009, 0010, 0011, ...

  3. %%~xf 提取扩展名(在此循环的所有情况下为.zip)并将其附加以形成最终文件名。所以它将遵循所需的顺序 0001.zip, 0002.zip, ... 0009.zip, 0010.zip, 0011.zip, ...

此方法适用于最多 9999 的任何数字。您可以轻松地将其扩展到 5 到 6 位甚至更多位。

【讨论】:

  • 完美!谢谢您的帮助!您能否稍微解释一下 "!fn:~-4!%%~xf" 的各个部分的含义?
猜你喜欢
  • 2016-06-04
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多