如何在调用删除项之前排除特定文件



我遇到的问题是将-Exclude命令插入此脚本以帮助避免像".pst"或任何其他指定的文件类型。 我现在确定如何将$exclude包含在Where-Object字段中。

$limit = (Get-Date).AddDays(2555)
$path = "\File Path"
$log = "C:Log output"
$exclude = ".pst"
# Delete files older than the $limit. <Use -WhatIf when you want to see what files/folders will be deleted before>
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $limit} >$log
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } >> $log
Get-ChildItem -Path $path  -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $limit}| Remove-Item -Force -WhatIf
Get-ChildItem -Path $path  -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -WhatIf 
# Delete any empty directories left behind after deleting the old files. <Use -WhatIf when you want to see what files/folders will be deleted before>
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null }  >> $log
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse -WhatIf 

任何想法都非常感谢。

要回答您的特定问题,您可以在Where-Object中添加另一个查看文件扩展名的子句。请注意,这有效,因为您只有一个扩展名。如果要添加更多,则需要更改运算符。

Get-ChildItem -Path $path -Recurse -Force | 
    Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $limit -and $_.Extension -ne $exclude } > $log

但是,您应该在代码中查看更好的选项。让 Windows 文件系统完成大部分工作而不是使用Where-Object进行后处理可以节省您的时间和复杂性。您甚至可以根据情况组合前几行。由于你有 v4,因此可以使用 -File-Directory 开关来仅拉取这些相应的项目。

Get-ChildItem -Path $path -Recurse -Force -File | 
    Where-Object {$_.LastWriteTime -lt $limit -and $_.CreationTime -lt $limit} | 
    Add-Content $log

虽然不完全是你的前几行在做什么,但我认为它做了你想做的事情。 请注意-File开关和组合日期子句。

如果您想记录要删除的内容,您还可以使用Tee-Object删除一些重复(不是解决此问题的唯一方法)

Get-ChildItem -Path $path -Recurse -Force -File | 
    Where-Object {$_.LastWriteTime -lt $limit -and $_.CreationTime -lt $limit} | 
    Tee-Object -FilePath $log | 
    Remove-Item -Force -WhatIf

我不知道你在哪里需要它,但你也可以使用Get-ChildItem -Exclude来省略 pst 文件。

Get-ChildItem -Path $_.FullName -Exclude $exclude -Recurse -Force

相关内容

  • 没有找到相关文章

最新更新