Batch file 编号脚本问题

Batch file 编号脚本问题,batch-file,rename,Batch File,Rename,我正在尝试创建我的第一个DOS脚本(更多用于bash) 我正在尝试创建一个脚本,使用序列号和年份作为前缀重命名我的图片。我创建了以下脚本: @ECHO OFF setlocal EnableDelayedExpansion echo. SET /P Year=Please enter Year (YYYY) : SET /P Start=Starting Number : dir set /A i=%Start% for %%f in (*.JPG) do

我正在尝试创建我的第一个DOS脚本(更多用于bash)

我正在尝试创建一个脚本,使用序列号和年份作为前缀重命名我的图片。我创建了以下脚本:

@ECHO OFF
setlocal EnableDelayedExpansion

echo.
SET /P Year=Please enter Year (YYYY) : 
SET /P Start=Starting Number          : 

dir     

set /A i=%Start%
for %%f in (*.JPG) do call :renameit "%%f"
goto done

:renameit

echo %1 %i%
set str=%i%
set str=0000!str:.=!
set str=!str:~-4!  
ren %1 PICT_%Year%_%str%.JPG
set /A i+=1

:done
问题是,它有时可以正常工作,有时需要通过一个额外的外观将已重命名的文件重命名回原处。下面是两个示例(如您所见,我在上面的脚本中添加了DIR和ECHO以进行故障排除):

运行1(正确):

C:\TEST的
目录
07/01/2013  10:55              .
07/01/2013  10:55              ..
2011年8月4日14:28 16.823 PICT_2012_0005.JPG
2011年8月4日14:28 16.823 PICT_2012_0006.JPG
2011年8月4日14:28 16.823 PICT_2012_0007.JPG
2013年1月7日10:56 368 script.cmd
4个文件50.837字节
2个目录30.342.901.760字节可用
“PICT_2012_0005.JPG”5
“PICT_2012_0006.JPG”6
“PICT_2012_0007.JPG”7
运行2(失败):

C:\TEST的
目录
07/01/2013  10:56              .
07/01/2013  10:56              ..
2011年8月4日14:28 16.823 PICT_2011_0005.JPG
2011年8月4日14:28 16.823 PICT_2011_0006.JPG
2011年8月4日14:28 16.823 PICT_2011_0007.JPG
2013年1月7日10:56 368 script.cmd
4个文件50.837字节
2个目录30.342.901.760字节可用
“PICT_2011_0005.JPG”5
“PICT_2011_0006.JPG”6
“PICT_2011_0007.JPG”7
“PICT_2012_0005.JPG”8
知道我做错了什么吗


谢谢

将评论扩展为完整答案

这是
for
命令的已知特性/问题/未定义行为。在文件目录中循环并修改这些文件时,for循环不会在文件夹中保留静态文件列表。相反,它只是检查下一个文件,直到文件系统没有返回任何内容。但是,当修改循环中的文件时,文件系统会将修改视为附加文件,并将其再次发送到for循环。这将导致重新处理未知数量的文件(基于for循环和文件系统的竞争条件)

请参阅此论坛,以深入讨论它

您也可以使用此语句:
for/F“delims=“%%F in('dir/B*.jpg')do call:renameit“%%~fF”


dir
命令将在运行时生成目录中文件的静态列表,以防止文件的递归。

这是
for
命令在循环遍历文件目录并对这些文件进行修改时的已知特性/问题/未定义行为。for循环不会在文件夹中保留文件的静态列表。请参阅此论坛,以深入讨论它。您也可以使用此语句:
for/F“delims=“%%F in('dir/B*.jpg')do call:renameit“%%~fF”
太好了,非常感谢。。做了一些测试,这句话看起来确实很好。
Directory of C:\TEST

07/01/2013  10:55    <DIR>          .
07/01/2013  10:55    <DIR>          ..
04/08/2011  14:28            16.823 PICT_2012_0005.JPG
04/08/2011  14:28            16.823 PICT_2012_0006.JPG
04/08/2011  14:28            16.823 PICT_2012_0007.JPG
07/01/2013  10:56               368 script.cmd
           4 File(s)         50.837 bytes
           2 Dir(s)  30.342.901.760 bytes free
"PICT_2012_0005.JPG" 5
"PICT_2012_0006.JPG" 6
"PICT_2012_0007.JPG" 7
Directory of C:\TEST

07/01/2013  10:56    <DIR>          .
07/01/2013  10:56    <DIR>          ..
04/08/2011  14:28            16.823 PICT_2011_0005.JPG
04/08/2011  14:28            16.823 PICT_2011_0006.JPG
04/08/2011  14:28            16.823 PICT_2011_0007.JPG
07/01/2013  10:56               368 script.cmd
           4 File(s)         50.837 bytes
           2 Dir(s)  30.342.901.760 bytes free
"PICT_2011_0005.JPG" 5
"PICT_2011_0006.JPG" 6
"PICT_2011_0007.JPG" 7
"PICT_2012_0005.JPG" 8