Batch file 如何在Windows批处理脚本中检查文件的时间戳创建?
我需要帮助如何检查时间戳超过2天的特定文件夹中的文件,然后将其删除或复制到其他位置?不确定是否删除,但您可以使用RoboCopy(它是Windows 7的一部分)。参数:/MAXAGE:n将复制比n早的文件-我通常会将其复制到备份文件夹,然后在确定后,我会从该目录中“删除”所有文件Batch file 如何在Windows批处理脚本中检查文件的时间戳创建?,batch-file,Batch File,我需要帮助如何检查时间戳超过2天的特定文件夹中的文件,然后将其删除或复制到其他位置?不确定是否删除,但您可以使用RoboCopy(它是Windows 7的一部分)。参数:/MAXAGE:n将复制比n早的文件-我通常会将其复制到备份文件夹,然后在确定后,我会从该目录中“删除”所有文件 希望这有帮助。一个简单的FOR循环,使用~t修饰符使用~SET命令返回目录中文件的上次修改日期 看这个例子 @echo off setlocal enabledelayedexpansion echo Files c
希望这有帮助。一个简单的
FOR
循环,使用~t
修饰符使用~SET
命令返回目录中文件的上次修改日期
看这个例子
@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!
)
)
有关详细信息,请参见帮助和帮助设置
: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
但是,对于上面显示的简单比较之外的日期比较,您需要提取每个日期组件
set dd=!tf:~0,2!
set mm=!tf:~3,2!
set yyyy=!tf:~6,4!
但是,等等,提取BAT文件中的日期组件是一个非常棘手的问题,因为%date%
和~t
修饰符使用短日期格式格式化日期,这是完全(无限)可自定义的。一个用户可以将其系统配置为返回Fri040811,而另一个用户可以选择2011年4月8日。对于一个蝙蝠程序员来说,这完全是一场噩梦
一种可能的解决方案是临时更改格式。看看这个例子
@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
在cmd上执行以下命令即可
forfiles /p "c:\path" /s /m *.* /d -365 /c "cmd /c del @file"
IMO此问题属于ServerFault您是指创建时间戳还是修改时间戳?@onof,IMO这是一个关于编程bat文件的问题。如果您有权访问,在PowerShell中执行此任务要容易得多。我不认为像这样临时更新注册表设置有多大意义。可能会导致其他正在运行的应用程序出现问题。为避免注册表操作,请使用wmic
。从命令行尝试下一步:for/F“tokens=*%G in('wmic os get localdatetime^ | find')do@echo=%G
。以方便的yyyymmddhhmmss…
格式返回系统本地日期和时间。~t已修改日期。是否可以创建日期?按照其他人的建议使用wmic。