我正在尝试创建我的第一个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以进行故障排除):
RUN 1(正确):
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
RUN 2(FAILED):
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
知道我做错了吗?
由于
答案 0 :(得分:3)
扩大对完整答案的评论。
for
命令的已知功能/问题/ 未定义行为。循环遍历文件目录并修改这些文件时,for循环不会在文件夹中保留静态文件列表。相反,它只检查下一个文件,直到文件系统没有返回任何内容。但是,在循环中修改文件时,文件系统会将修改视为附加文件,并再次发送到for循环。这将导致重新处理文件的未知数(基于for循环和文件系统的竞争条件)。
请参阅此论坛以深入讨论它。
http://www.dostips.com/forum/viewtopic.php?f=3&t=4138&sid=463cb91964f497c478afcca79c33384a
您也可以将此用作声明:for /F "delims=" %%F in ('dir /B *.jpg') do call :renameit "%%~fF"
dir
命令将在运行时生成目录中文件的静态列表,防止文件递归。