1

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

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

到目前为止,这是我所拥有的:

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。

4

1 回答 1

3

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

只需将您的线路更改为

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

它应该工作。

但是一旦你更正它,你的方法仍然会在 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 位甚至更多位。

于 2012-08-01T15:24:02.563 回答