在forfiles中为变量设置变量

时间:2015-12-27 20:30:34

标签: cmd

@Echo On
FOR %%f IN (*.jpg) DO (
    forfiles /M "%%f" /C "cmd /V:ON /c set fn=@ftime"
    echo %%fn%%
)
pause

我想在@ftime循环中获得FOR,但这不起作用。也许有另一种方法可以获得文件的修改时间?

3 个答案:

答案 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