【问题标题】:How can I check the time stamp creation of a file in a Windows batch script?如何检查 Windows 批处理脚本中文件的时间戳创建?
【发布时间】:2011-07-27 06:20:29
【问题描述】:

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

【问题讨论】:

  • IMO 这个问题属于 serverfault
  • 你是指创建时间戳还是修改时间戳?
  • @onof,IMO,这是一个关于编写 bat 文件的问题。
  • 如果您可以访问它,在 PowerShell 中完成这项任务要容易得多

标签: batch-file


【解决方案1】:

使用~t 修饰符的SET 命令的简单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 将零开头的数字解释为八进制的方式的问题。

所以,把所有这些部分放在一起......

@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

【讨论】:

  • 不能说我想像这样临时更新注册表设置。可能会导致其他正在运行的应用出现问题。
  • 避免注册表操作,使用wmic。从命令行尝试下一步:for /F "tokens=*" %G in ('wmic os get localdatetime^|find "."') do @echo =%G。以方便的yyyymmddhhmmss... 格式返回系统本地日期和时间。
  • ~t 是修改日期。是否可以创建日期?
  • 按照其他人的建议使用 wmic。
【解决方案2】:

不确定是否要删除,但您可以使用 RoboCopy(它是 Windows 7 的一部分)。参数:/MAXAGE:n 将复制早于 n 的文件 - 我通常会复制到备份文件夹,然后一旦确定,我会从该目录中“删除”所有文件。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-17
      • 2020-05-22
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多