FORFILES date -after-(cmd文件中的日期计算)

Deb*_*bra 3 windows powershell cmd date batch-file

我想在cmd文件中使用FORFILES,以在给定日期后到“今天”对所有文件执行操作。我可以forfiles /d +07/10/2013 /c "cmd /c echo @fname"在13年7月10日之后使用类似的方法对所有内容执行操作,但是我想要的只是能够从“今天”之前的90天开始计算。

是否有用于日期计算的语法,该语法将在cmd文件中工作,可以让我指定“今天之前的x天”以馈入FORFILES?

我更喜欢不使用VBS(并找到了可在VBS中使用的代码段),尽管我可以选择为Powershell重新编写脚本,但理想情况下,我想坚持使用cmd。

为了明确起见,“-90”将查找所有超过90天的文件;“ +90”将找到今天之后90天以后的所有文件(从根本上讲是没有用的,因为很少写入带有未来日期的文件),“ + 7/30/2013”​​将找到所有7/30之后的文件/ 2013。我想要最后一个时间段,最好是能够将传递给CMD文件的天数变量表示为“在x今天之前的x天之后”,即“在最近的x天”。因此,我不想使用上面显示的硬编码日期,而是希望能够在cmd文件中计算该日期。

asc*_*pfl 6

下面是设计缺陷一个变通forfiles有关/D +dd天,假设没有项目可以在将来进行修改,并且这是基于两个嵌套forfiles循环和依赖于这样的事实forfilesErrorLevel的情况下,没有任何项目符合所提供的搜索条件:

rem Define minimum and maximum age in days here (0 means today):
set /A MINAGE=0, MAXAGE=90

set "MAXAGE=%MAXAGE:*-=%" & set "MINAGE=%MINAGE:*-=%" & set /A MAXINC=MAXAGE+1
> nul forfiles /D -%MINAGE% /C "cmd /C if @isdir==FALSE 2> nul forfiles /M @file /D -%MAXINC% || > con echo @fdate  @file"
Run Code Online (Sandbox Code Playgroud)

forfiles循环遍历至少与variable给定的项目相同的项目MINAGE。内forfiles循环在@file从外循环接收到迭代文件时最多迭代一次,如果它也至少与MAXINC(equals MAXAGEplus 1)一样旧,则返回相同的文件;如果不是,forfiles则将设置ErrorLevel1,然后由||执行以下命令的操作员捕获,即echo仅在ErrorLevel已设置为非零值的情况下捕获。

双方MINAGEMAXAGE不能是负数(命令set "MAXAGE=%MAXAGE:*-=%"set "MINAGE=%MINAGE:*-=%"删除减号的情况下)。MAXINC引入了临时变量,以便将MAXAGE自身指定的年龄包括在返回结果中。

重定向> nul可防止外部forfiles的返回空行,而内部的则返回满足其搜索条件的项(因为我们对那些不符合的条件感兴趣)。2> nul防止内部forfiles循环在违反其搜索条件的情况下返回错误消息。> con覆盖> nulecho命令返回实际需要的项目。

if @isdir==FALSE部分过滤掉目录,以便仅处理文件。如果只想处理目录,请更改FALSETRUE;如果要同时处理两者,请将其完全删除。


Ans*_*ers 2

在 PowerShell 中你可以这样做:

$refdate = (Get-Date).AddDays(-90)
Get-ChildItem | Where-Object {
    $_.LastWriteTime -ge $refdate
} | Select-Object -Expand Name
Run Code Online (Sandbox Code Playgroud)