我试图通过修改日期时间重命名文件夹中的图像。
@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先解析然后计算。我该怎么办?
答案 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"