不能在forfiles中使用if语句

时间:2015-12-26 20:46:21

标签: cmd

我试图通过修改日期时间重命名文件夹中的图像。

@Echo On
forfiles /M *.jpg /C "cmd /c set "f=@fdate@ftime" & call rename @file %%f:~6,4%%.%%f:~3,2%%.%%f:~0,2%%[%%f:~10,2%%-%%f:~13,2%%-%%f:~16,2%%].jpg"
pause

但是如果ftime小时是1digit,它就会出现

二〇一五年十二月一十二日[20-07-06] .JPG

2015.12.16 [3:-6:-8] .jpg

所以我不会检查,如果f中的第12个符号是“:”(也就是小时数是2digit),则更正positins。但

forfiles /M *.jpg /C "cmd /c set "f=@fdate@ftime" & call set b=%%f:~12,1%% & if %%b%%==":" (call "foo")"

不行。我认为它是因为我不能“调用if”而b先解析然后计算。我该怎么办?

1 个答案:

答案 0 :(得分:0)

在下面的代码示例中,forfiles /M *.jpg命令部分由省略号()替换,以提高可读性:

您需要使用启用的延迟扩展(注意/V:ON切换):

… /C "cmd /V:ON /c set "f=@fdate@ftime"& set "b=!f:~12,1!"& if [!b!]==[:] (call "foo")"

或重新制定您的测试如下:

… /C "cmd /c set "f=@fdate@ftime" & call set "b=%%f:~12,1%%"& call set "b=%%b::=%%"& if not defined b (call "foo")"

如果已启用延迟扩展,那么前一种情况应该使用转义!(感叹号),如下所示:

… /C "cmd /V:ON /c set f=@fdate@ftime& set b=^!f:~12,1^!& if [^!b^!]==[:] (call "foo")"

编辑:一个操作示例(注意没有内部"双引号,下一版本中所有&符号前没有空格)

echo OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
forfiles /M *.jpg /C "cmd /V:ON /c set f=@fdate@ftime& set b=!f:~12,1!& if [!b!]==[:] (echo(!f! !b! 13th) else (echo(!f! !b! not 13th)"
ENDLOCAL
pause >NUL
SETLOCAL EnableExtensions EnableDelayedExpansion
forfiles /M *.jpg /C "cmd /V:ON /c set f=@fdate@ftime& set b=^!f:~12,1^!& if [^!b^!]==[:] (echo ^!f^! ^!b^! 13th) else (echo ^!f^! ^!b^! not 13th)"
ENDLOCAL
pause >NUL
forfiles /M *.jpg /C "cmd /c set f=@fdate@ftime& call set b=%%f:~12,1%%& call set a=%%b::=%%& if not defined a (call echo %%f%% %%b%% 13th) else (call echo %%f%% %%b%% not 13th)"

输出(当前目录中的两个文件):

==> D:\bat\SO\34475095.bat

14.09.201522:36:05 : 13th
27.12.201501:09:47 : 13th

14.09.201522:36:05 : 13th
27.12.201501:09:47 : 13th

14.09.201522:36:05 : 13th
27.12.201501:09:47 : 13th

==>
长文件名的

提示:请注意,例如: @Path变量已包含周围的"双引号;使用周围"双引号escaped作为\"代替普通""^"作为自定义文件名部分;例如,

… if [!b!]==[:] (echo(!f! \"!b! 13th\") else (echo(!f! \"!b! not 13th\")

会显示

14.09.201522:36:05 ": 13th"
27.12.201501:09:47 ": 13th"