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

Batch file 如何在Windows批处理脚本中检查文件的时间戳创建?,batch-file,Batch File,我需要帮助如何检查时间戳超过2天的特定文件夹中的文件,然后将其删除或复制到其他位置?不确定是否删除,但您可以使用RoboCopy(它是Windows 7的一部分)。参数:/MAXAGE:n将复制比n早的文件-我通常会将其复制到备份文件夹,然后在确定后,我会从该目录中“删除”所有文件 希望这有帮助。一个简单的FOR循环,使用~t修饰符使用~SET命令返回目录中文件的上次修改日期 看这个例子 @echo off setlocal enabledelayedexpansion echo Files c

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

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


希望这有帮助。

一个简单的
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。