@Echo On
FOR %%f IN (*.jpg) DO (
forfiles /M "%%f" /C "cmd /V:ON /c set fn=@ftime"
echo %%fn%%
)
pause
我想在@ftime
循环中获得FOR
,但这不起作用。也许有另一种方法可以获得文件的修改时间?
答案 0 :(得分:0)
您无法通过forfiles
调用在批处理文件中设置变量,因为该变量将始终生成新的shell。 forfiles
是一个程序,而不是内置命令。
但是,您可以在循环中使用%%tf
获得修改时间,而不是forfiles
:
setlocal enabledelayedexpansion
FOR %%f IN (*.jpg) DO (
set "fn=%%~tf"
echo !fn!
)
答案 1 :(得分:0)
在您的方法中,您在由fn
打开的cmd
实例中设置变量forfiles
,但此变量在cmd
实例中不再可用运行你的脚本。
您可以使用~t
变量的for
修饰符(代码中为%%~tf
)来获取修改日期和时间,然后通过子字符串扩展拆分时间部分(请参阅set /?
),如果分钟的特征分辨率足够("%%~nxF"
部分恰好在返回时间之前,并带有当前文件名):
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for %%F in ("*.jpg") do (
set "FTIME=%%~tF"
rem The following line depends on region settings:
echo "%%~nxF": !FTIME:~11!
)
endlocal
pause
或者,您可以使用for /F
循环从日期中拆分时间部分:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in ("*.jpg") do (
for /F "tokens=1,* delims= " %%I in ("%%~tF") do (
echo "%%~nxF": %%J
)
)
endlocal
pause
如果您需要forfiles
支持的秒数分辨率,则需要回显@ftime
中的forfiles
值并通过for /F
循环捕获该值,每个文件只有一次(时间)(@file
返回当前文件名,然后由"%%~K"
保存):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in ("*.jpg") do (
for /F "tokens=1,* delims=|" %%K in ('
forfiles /M "%%~F" /C "cmd /C echo @file^|@ftime"
') do (
echo "%%~K": %%L
)
)
endlocal
pause
根据您的应用程序,您可能不需要单独的for
循环来浏览*.jpg
个文件,因为forfiles
可以自行执行此操作:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=1,* delims=|" %%K in ('
forfiles /M "*.jpg" /C "cmd /C echo @file^|@ftime"
') do (
echo "%%~K": %%L
)
endlocal
pause
答案 2 :(得分:0)
如果您确实需要FORFILES,只需将输出写入tempfile:
...
set file=temp.txt
...
FORFILES /M "%%f" /C "cmd /c echo @ftime >> %file%"
FOR /F "usebackq tokens=1,*" %%a In ("%file%") Do (Set fn=%%a | echo %fn%)
DEL %file% /q