如何在Windows批处理脚本中检查文件的时间戳创建?

4

我需要帮助,如何检查特定文件夹中时间戳超过2天的文件,然后将其删除、移动或复制到其他地方?


我认为这个问题应该属于ServerFault。 - onof
你是指创建时间戳还是修改时间戳? - PA.
@onof,我认为这是关于编写批处理文件的问题。 - PA.
如果您可以访问PowerShell,那么这项任务会变得非常容易。 - alecov
3个回答

3

一个使用 SET 命令和 ~t 修改符的简单的 FOR 循环可以返回目录中文件的最后修改日期。

请看下面的示例:

@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 FORHELP 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解释以0开头的数字为八进制的问题。

将所有这些部分组合起来...

@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
我认为像这样暂时更新注册表设置并不可取。这可能会给其他正在运行的应用程序带来问题。 - Joe
2
避免注册表操作,使用 wmic。尝试从命令行执行以下命令:for /F "tokens=*" %G in ('wmic os get localdatetime^|find "."') do @echo =%G。该命令以方便的 yyyymmddhhmmss... 格式返回系统本地日期和时间。 - JosefZ
“~t” 是修改日期。能否获取创建日期? - M Kenyon II
使用wmic,就像其他人建议的那样。 - PA.

0

0

不确定是否要删除,但您可以使用Windows 7中的RoboCopy。参数:/MAXAGE:n将复制早于n的文件 - 我通常会将其复制到备份文件夹中,稍后在确认后从该目录中执行“全部删除”操作。

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接