【问题标题】:Powershell script to delete files older than x days, but not foldersPowershell脚本删除超过x天的文件,但不删除文件夹
【发布时间】:2014-10-28 23:07:09
【问题描述】:

我有一个我认为可以运行的脚本,但我收到报告说它删除了文件夹而不仅仅是文件。有人可以帮我调整我的脚本来解决这个问题吗?是否需要添加 -file 过滤器?

$Path = "D:\AppData\Downloads"

$Limit = (Get-Date).AddDays(-6)

Get-ChildItem -path $Path -Recurse -force | Where-Object {!$_.PSIsContainer -and $_.CreationTime -lt $Limit } | Remove-Item -recurse -Force

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您的 Where-Object 子句很可能不会像您期望的那样工作。

    {!$_.PSIsContainer -and $_.CreationTime -lt $Limit } 
    

    应该是

    {!$_.PSIsContainer -and ($_.CreationTime -lt $Limit)} 
    

    括号确保第二个逻辑比较独立评估。有关详细信息,请参阅 about_logical_operators

    Windows PowerShell 逻辑运算符仅计算语句 需要判断语句的真值。如果左操作数 在包含 and 运算符的语句中为 FALSE,右操作数 不评估。如果语句中的左操作数包含 or 语句为 TRUE,则不计算右操作数。因此, 您可以像使用这些语句一样使用这些语句 If 语句。

    此外,由于它正在删除文件而不是文件夹,因此 -Recurse for Remove-Item 似乎没有必要。 根据 Alroc 的评论:假设您拥有 PowerShell 3 或更高版本,您可以使用 Get-ChildItem-File 参数代替 Where-Object!$_.PSIsContainer 子句来简化此操作(这是通常所做的在第 2 版中。)就像您在评论中所说的那样:

    Get-ChildItem -path $Path -file -Recurse -force | Where-Object {$_.CreationTime -lt $Limit }
    

    【讨论】:

    • 在 v3 及更高版本中,您可以使用 -file 开关来切换 get-childitem 并跳过检查 $_.PSIsContainerwhere-object 中的每个对象的检查。
    • 感谢马特和阿尔洛克。所以这看起来更好吗? Get-ChildItem -path $Path -file -Recurse -force | Where-Object {$_.CreationTime -lt $Limit } | Remove-Item -Force
    • @Powershell_Toddler 看起来不错,但您应该先对其进行测试。只需在测试中删除Remove-Item 并检查您的结果。干得好!
    • -whatif 仅显示文件,在删除 -whatif 后,我仍有最后修改日期超过 6 天的文件夹。看起来它的工作,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多