If statement For循环中的批处理文件If语句

If statement For循环中的批处理文件If语句,if-statement,batch-file,for-loop,If Statement,Batch File,For Loop,我的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 ena

我的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语句没有将文件前缀更改为0。

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

把你的线路换成

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
)
圈内

  • 代码
    0000!伯爵在数字后面加上一些零(本例中为4);所以它将遵循序列00001,00002。。。00009000010000011

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

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


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

    如果对我有用的话。你确定你已经发布了你正在运行的非常准确的代码吗?是的,它肯定是相同的代码。我再次检查并运行了它,我仍然得到了名为0010.zip、0011.zip等等的文件。哦,我知道问题出在哪里了。您不会对文件前缀应用延迟扩展。是我没有复制精确的密码。很抱歉编辑了我的答案。可能是完美的复制品!谢谢你的帮助!你能解释一下“!fn:~-4!%%~xf”的各个部分是什么意思吗?