我需要帮助如何检查时间戳超过2天的特定文件夹中的文件,然后删除或删除或复制到其他地方?
答案 0 :(得分:3)
使用FOR
修饰符的SET
命令的简单~t
循环返回目录中文件的上次修改日期。
参见此示例
@echo off
setlocal enabledelayedexpansion
echo Files changed today %date%
FOR %%A IN (*.*) DO (
set tf=%%~tA
set fd=!tf:~0,10!
if !fd!==%date% (
echo %%F !tf!
)
)
有关详细信息,请参阅HELP FOR
和HELP SET
。
但是,为了比较上述简单比较之外的日期,您需要提取每个日期组件
set dd=!tf:~0,2!
set mm=!tf:~3,2!
set yyyy=!tf:~6,4!
但是,等等,在BAT文件中提取日期组件是一个非常棘手的问题,因为%DATE%
和~t
修饰符使用短日期格式格式化日期,这是完全的(无休止地) )可定制。一个用户可以将其系统配置为返回Fri040811,而另一个用户可以选择08/04/2011。对于BAT程序员来说,这是一场彻底的噩梦。
一种可能的解决方案是暂时更改格式。见这个例子。
@echo off
echo System Date Time = %date% %time%
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul
echo Normalized Date Time = %date% %time%
set dd=%date:~8,2%
set mm=%date:~5,2%
set yyyy=%date:~0,4%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul
最后你应该用日期做算术,你需要将DD MM YYYY中的日期转换为天数,这两者都不是很明显。以下是进行此转换的一些代码。
:days
:: Algorithm based on Fliegel-Van Flandern algorithm from the Astronomical Almanac,
:: provided by Doctor Fenton on the Math Forum (http://mathforum.org/library/drmath/view/51907.html),
:: and converted to batch code by Ron Bakowski.
SET /A Month1 = ( 1%MM% %% 100 - 14 ) / 12
SET /A Year1 = %YYYY% + 4800
SET /A days = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( (1%MM% %% 100) - 2 -12 * %Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + (1%DD% %% 100) - 32075
SET Month1=
SET Year1=
goto :eof
奇怪的习语(1%MM% %% 100)
用于解决问题,SET /A
将八进制解释为以零开头的数字。
所以,将所有这些部分放在一起......
@echo off
setlocal enabledelayedexpansion enableextensions
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul
set dd=%date:~8,2%
set mm=%date:~5,2%
set yyyy=%date:~0,4%
call :days
set /a today=!days!
FOR %%A IN (*.*) DO (
set tf=%%~tA
set fd=!tf:~0,10!
set dd=!fd:~8,2!
set mm=!fd:~5,2!
set yyyy=!fd:~0,4!
call :days
set /a age= !today!-!days!
if !age! leq 2 (
echo %%A is !age! days old
)
)
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul
goto :eof
:days
:: Algorithm based on Fliegel-Van Flandern algorithm from the Astronomical Almanac,
:: provided by Doctor Fenton on the Math Forum (http://mathforum.org/library/drmath/view/51907.html),
:: and converted to batch code by Ron Bakowski.
SET /A Month1 = ( 1%MM% %% 100 - 14 ) / 12
SET /A Year1 = %YYYY% + 4800
SET /A days = 1461 * ( %Year1% + %Month1% ) / 4 + 367 * ( (1%MM% %% 100) - 2 -12 * %Month1% ) / 12 - ( 3 * ( ( %Year1% + %Month1% + 100 ) / 100 ) ) / 4 + (1%DD% %% 100) - 32075
SET Month1=
SET Year1=
goto :eof
答案 1 :(得分:0)
不确定删除,但您可以使用RoboCopy(它是Windows 7的一部分)。参数:/ MAXAGE:n将复制早于n的文件 - 我通常会将副本复制到备份文件夹中,之后我确定在该目录中“删除”所有文件。
希望这有帮助。
答案 2 :(得分:0)
here is the reference of how you can delete files older than 2 days
在cmd上执行以下命令即可。
forfiles /p "c:\path" /s /m *.* /d -365 /c "cmd /c del @file"