我将有一个变量,它等于1-7的任何数字,代表1天,依此类推。我需要找到一个与该变量在天数相同的文件。
例如
set "age=4"
// code to find the file OR folder that is 4 days old
值得注意的是,我需要获取此文件的文件名
答案 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
您可以使用mtime而不是atime来修改日期而不是创建日期。