powershell FORFILES日期之后-(cmd文件中的日期计算)

4uqofj5v  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(176)

我想在cmd文件中使用FORFILES,以操作给定日期之后的所有文件,直到“今天”。我可以使用像forfiles /d +07/10/2013 /c "cmd /c echo @fname"这样的东西来处理2013年7月10日之后的所有事情,但我想要的是能够从90天之前的“今天”开始计算。
Cmd文件中有没有日期计算的语法,可以让我指定“今天之前的x天”来输入FORFILES?
我不喜欢使用VBS(我找到了一个可以在VBS中工作的代码片段),尽管我也可以为PowerShell重写脚本,但理想情况下我想坚持使用cmd。
需要说明的是,“-90”将查找所有早于90天的文件;“+90”将查找今天之后90天之后的所有文件(这基本上毫无用处,因为文件很少写入未来日期),而“+7/30/2013”将查找所有晚于2013年7月30日的文件。我想要最后一个时间段,最好是能够将天数变量传递给CMD文件,它将显示为“在今天之前的x天之后”,即“在过去的x天中”。因此,我希望能够在cmd文件中计算该日期,而不是使用上面所示的硬编码日期。

mspsb9vt

mspsb9vt1#

以下是forfiles/D +dd天有关的设计缺陷的解决方法,假定将来不能修改任何项,它基于两个嵌套的forfiles循环,并依赖于forfiles在没有项与提供的搜索条件匹配的情况下设置ErrorLevel的事实:

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"

外部的forfiles循环遍历至少与变量MINAGE给定的一样旧的项。内部forfiles循环在从外部循环接收迭代文件@file时最多迭代一次,如果它也至少与MAXINC一样旧(等于MAXAGE+1),则返回相同的文件;如果不是这样,forfilesErrorLevel设置为1,而只有在ErrorLevel设置为非零值的情况下,||操作符才会捕获该1,该操作符执行以下命令,即echo
MINAGEMAXAGE都不能是负数(命令set "MAXAGE=%MAXAGE:*-=%"set "MINAGE=%MINAGE:*-=%"去掉减号大小写)。引入了临时变量MAXINC,以便将MAXAGE本身指定的年龄包含在返回结果中。
重定向> nul阻止外部forfiles返回空行,而内部forfiles则阻止返回满足其搜索条件的项(因为我们对那些不符合搜索条件的项感兴趣)。2> nul防止内部forfiles循环在其搜索条件被违反时返回错误消息。> con覆盖> nul以使echo命令实际返回所需的项。
if @isdir==FALSE部分过滤出目录,以便只处理文件。如果只想处理目录,则将FALSE更改为TRUE;如果想同时处理两个目录,则将其完全删除。

polhcujo

polhcujo2#

在PowerShell中,您可以执行以下操作:

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

相关问题