从文件名中获取日期并检查年龄

时间:2014-12-15 19:04:14

标签: batch-file

我将有一个变量,它等于1-7的任何数字,代表1天,依此类推。我需要找到一个与该变量在天数相同的文件。

例如

set "age=4" // code to find the file OR folder that is 4 days old

值得注意的是,我需要获取此文件的文件名

3 个答案:

答案 0 :(得分:1)

在这里,试试这个:

@echo off
setlocal

set age=4
set /a maxage=age+1

:: For files that are %age% days old or older, set a variable
for /f "delims=" %%I in ('forfiles /d -%age%') do (
    set "fileArr[%%~snxI]=%%~fI"
)

:: for files that are %age% + 1 days old or older, unset variable
for /f "delims=" %%I in ('forfiles /d -%maxage%') do (
    set "fileArr[%%~snxI]="
)

:: Get values of all remaining fileArr variables
for /f "tokens=1,* delims==" %%I in ('set fileArr') do echo(%%J

从评论中可以看出,首先脚本会获取所有文件%age%天或更旧,并设置变量。要使变量名称唯一并且以后能够对其进行索引,变量名称包含短文件名,模拟关联数组。接下来,它会取消那些%age% + 1天或更旧的变量,然后输出剩下的内容。

不需要痛苦的约会数学。 forfiles处理计算。如果你需要按分钟计算,那么that gets a little more complicated;但是forfiles白天处理数学就好了。

答案 1 :(得分:1)

我找到了一个更容易的解决方案:

ROBOCOPY "D:\file-backups\%ThisUser_Username%\Server"^
         "%ThisService_WorkingDirectory%@DayZ_Epoch_Server\Addons"^
         "dayz_server_*.pbo"^
         /minage:%ThisService_filerestoreage%^
         /maxage:%ThisService_filerestoreage%

答案 2 :(得分:0)

在批处理中,只要您获得与年龄相对应的修改日期(因此%DATE% - %AGE%),您就可以使用the ~t modifier in a parameter expansion to get the age of the file

请注意,如果您的系统上有PowerShell(并且您确实应该因为Win7之前已经预装了,请参阅注释),您可以使用它来轻松地进行日期计算。

因此,一个执行所需操作的脚本(参数为%age%,例如可以用命令行参数替换):

set age=4
for /f "delims=|" %%i in ('powershell.exe -Command "Get-Date  -Format dd/MM/yyyy -Date ([DateTime]::Today.AddDays(-%age%))"') do set age_date=%%i

echo Files modified %age% days ago (the %age_date%) are :

setlocal ENABLEDELAYEDEXPANSION

for /f "delims=|" %%f in ('dir /b') do (
    set file_date=%%~tf
    if "!file_date:~0,10!"=="%age_date%" (echo %%f)
)

对于一个纯批处理脚本来获取替换powershell调用的日期(比如遗留版本),你可以稍微修改一下这里的代码:http://www.powercram.com/2010/07/get-yesterdays-date-in-ms-dos-batch.html,即使这会非常难看。


相比之下,类似unix的系统有一个工具,请参阅man find,这更加用户友好。

find /path/to/parent/directory -daystart -atime $age 
  • atime:文件最后一次访问n * 24小时前
  • $年龄没有领先+或 - :找到完全年龄*年龄* 24小时(而不是更少或相等,或更高或相等)
  • daystart:       测量时间(-amin,-atime,-cmin,-ctime,-mmin和       -mtime)从今天开始而不是从24小时开始       前

您可以使用mtime而不是atime来修改日期而不是创建日期。