Powershell 如何将if语句与forfiles一起使用以匹配模式,并在超过x天时删除?

Powershell 如何将if语句与forfiles一起使用以匹配模式,并在超过x天时删除?,powershell,batch-file,if-statement,Powershell,Batch File,If Statement,如何在forfiles中使用if-else语句匹配文件名模式并将文件保留90天删除旧文件,如果模式不匹配则保留30天 脚本需要递归地检查所有文件的路径,如果*pattern.log匹配,则需要将文件保留90天,对于所有其他文件,仅保留30天。 -文件夹无论如何都应该保存; -这包含大量文件,仅使用Powershell会使其速度非常慢,并且需要花费超过一天的时间,因此,最后我还是坚持使用带有if-else条件的forfiles。 我对脚本编写相当陌生,无法找到如何使用if-else匹配模式 Get

如何在forfiles中使用if-else语句匹配文件名模式并将文件保留90天删除旧文件,如果模式不匹配则保留30天

脚本需要递归地检查所有文件的路径,如果*pattern.log匹配,则需要将文件保留90天,对于所有其他文件,仅保留30天。 -文件夹无论如何都应该保存; -这包含大量文件,仅使用Powershell会使其速度非常慢,并且需要花费超过一天的时间,因此,最后我还是坚持使用带有if-else条件的forfiles。 我对脚本编写相当陌生,无法找到如何使用if-else匹配模式

Get-ChildItem -Path C:\Data | ForEach-Object {
    $serverpath = $_.FullName
    forfiles /p "$serverpath\Logs" /s /d -30 /c "cmd /c del /Q /F @file"
}

这段代码运行良好,可以删除所有超过30天的文件。然而,现在我需要保留一个匹配的模式文件名90天,这是我一直坚持的。请帮忙

您不需要旧的批处理可执行文件
forfiles
powershell完全能够执行此操作:

$Path = "C:\Data"
$Files = Get-ChildItem -Path $Path -Recurse -File  
ForEach($File in $Files)  { 
    if ($File.LastWriteTime -le (Get-Date).AddDays(-90)){
        Remove-Item $File
    } elseif ($File.Name -notlike "*.log" -and $File.LastWriteTime -le (Get-Date).AddDays(-30)){
        Remove-Item $File
    }
}

用您的父亲替换
$File.Name-不象“*.log”

您不需要文件的旧批处理可执行文件
powershell完全能够执行此操作:

$Path = "C:\Data"
$Files = Get-ChildItem -Path $Path -Recurse -File  
ForEach($File in $Files)  { 
    if ($File.LastWriteTime -le (Get-Date).AddDays(-90)){
        Remove-Item $File
    } elseif ($File.Name -notlike "*.log" -and $File.LastWriteTime -le (Get-Date).AddDays(-30)){
        Remove-Item $File
    }
}

用您的父亲替换
$File.Name-不象“*.log”

删除项
接受管道输入时,带有比较的单个
对象
更加优雅

Get-ChildItem -Path C:\Data\Logs -Files -Recurse | Where-Object {
    $_.LastWriteTime -le (Get-Date).Date.AddDays(-90) -or
  ( $_.LastWriteTime -le (Get-Date).Date.AddDays(-30) -and
    $_.Extension -ne '.Log' ) } | Remove-Item -WhatIf
如果输出看起来正常,请删除尾随的
-WhatIf


我很好奇在什么条件下(文件编号/大小)
对于文件
的速度更高。

删除项
接受管道输入时,单个
对象
进行比较更优雅

Get-ChildItem -Path C:\Data\Logs -Files -Recurse | Where-Object {
    $_.LastWriteTime -le (Get-Date).Date.AddDays(-90) -or
  ( $_.LastWriteTime -le (Get-Date).Date.AddDays(-30) -and
    $_.Extension -ne '.Log' ) } | Remove-Item -WhatIf
如果输出看起来正常,请删除尾随的
-WhatIf


我很好奇在什么条件下(文件编号/大小)
文件的速度优于

谢谢LotPingsT-Me,我结合了您的建议,并通过以下代码行修复了我的情况,我粘贴在这里供大家参考:

Get-ChildItem -Path "C:\Data" -Recurse -File | ForEach-Object {
if($_.LastWriteTime -le (get-date).AddDays(-90) -or ($_.Name -notlike "*pattern.log" -and $_.LastWriteTime -le (Get-Date).AddDays(-30))) {
    Remove-Item $_.FullName
    }
}

另外,其他脚本花费很长时间的原因是,我将文件信息存储在变量中,我注意到,在这种情况下,由于文件数量巨大,需要消耗大量RAM 10+GB的RAM,因此我不得不强制关闭它。我每天使用脚本运行的计划任务实际上需要大约5天才能完成,因此每次运行失败的时间约为4-5天。但现在只需要几个小时,我最初遇到的问题已经解决了

谢谢你LotPingsT-Me,我结合了你的建议,并能够通过以下代码行修复我的情况,我将这些代码粘贴到这里供任何人参考:

Get-ChildItem -Path "C:\Data" -Recurse -File | ForEach-Object {
if($_.LastWriteTime -le (get-date).AddDays(-90) -or ($_.Name -notlike "*pattern.log" -and $_.LastWriteTime -le (Get-Date).AddDays(-30))) {
    Remove-Item $_.FullName
    }
}

另外,其他脚本花费很长时间的原因是,我将文件信息存储在变量中,我注意到,在这种情况下,由于文件数量巨大,需要消耗大量RAM 10+GB的RAM,因此我不得不强制关闭它。我每天使用脚本运行的计划任务实际上需要大约5天才能完成,因此每次运行失败的时间约为4-5天。但现在只需要几个小时,我最初遇到的问题已经解决了

对于文件
cmd/c
不需要
。管道至
Where Object
以筛选要删除的内容,然后管道至
删除项目
以删除项目。有关详细信息,请参阅cmdlet的PowerShell帮助主题。不需要
forfiles
cmd/c
。管道至
Where Object
以筛选要删除的内容,然后管道至
删除项目
以删除项目。有关详细信息,请参阅cmdlet的PowerShell帮助主题。Forfiles是一个已编译的可执行文件。它不是cmdlet。@T-Me:谢谢你的建议,但是,这无助于解决问题,因为该文件夹包含数百万个文件(如果不是数十亿的话),大部分是平面txt和zip文件。我不知道为什么,但当这个扫描大小为几GB的.zip文件时,这需要花费时间。Forfiles是一个已编译的可执行文件。它不是cmdlet。@T-Me:谢谢你的建议,但是,这无助于解决问题,因为该文件夹包含数百万个文件(如果不是数十亿的话),大部分是平面txt和zip文件。我不知道为什么,但是当这个扫描大小为几GB的.zip文件时,这需要时间。谢谢你的建议,这个看起来很好,格式也很好。但是,在遍历大小为几GB的zip文件时,这同样需要很长时间。不确定zip文件是否导致问题。当我运行forfiles时,它工作正常,递归地删除文件。该目录包含约12TB的数据,其中大部分是平面数据文件,如csv、日志文件和zip文件。我不确定zip文件是否造成了所有这些问题(forfiles和Get ChildItem都不会打开zip文件。您上面的forfile命令会将
\Logs
附加到路径中;这是只迭代此子树而加快速度的原因吗?将答案更改为使用
C:\Data\Logs
谢谢您的建议,此子树看起来很好,格式也很好。不过,这需要很长时间e在迭代大小为几GB的zip文件时。不确定zip文件是否导致问题。当我运行forfiles时,它可以正常工作,递归删除文件。该目录包含约12TB的数据,其中大部分包含平面数据文件,如csv、日志文件和zip文件。我不确定zip文件是否导致所有这些问题:(forfiles和Get ChildItem都不会打开zip文件。您上面的forfile命令会将
\Logs
附加到路径;这是只迭代此子树而加快速度的原因吗?将答案更改为使用
C:\Data\Logs