Powershell 如何将if语句与forfiles一起使用以匹配模式,并在超过x天时删除?
如何在forfiles中使用if-else语句匹配文件名模式并将文件保留90天删除旧文件,如果模式不匹配则保留30天 脚本需要递归地检查所有文件的路径,如果*pattern.log匹配,则需要将文件保留90天,对于所有其他文件,仅保留30天。 -文件夹无论如何都应该保存; -这包含大量文件,仅使用Powershell会使其速度非常慢,并且需要花费超过一天的时间,因此,最后我还是坚持使用带有if-else条件的forfiles。 我对脚本编写相当陌生,无法找到如何使用if-else匹配模式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
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
我很好奇在什么条件下(文件编号/大小)
文件的速度优于。谢谢LotPings和T-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天。但现在只需要几个小时,我最初遇到的问题已经解决了 谢谢你LotPings和T-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