我有一个我认为正在运行的脚本,但我收到的报告是删除文件夹而不是文件。有人可以帮我调整我的脚本来解释这个吗?我是否需要添加-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
答案 0 :(得分:2)
You Where-Object子句很可能不像您期望的那样工作。
{!$_.PSIsContainer -and $_.CreationTime -lt $Limit }
应该是
{!$_.PSIsContainer -and ($_.CreationTime -lt $Limit)}
括号确保第二次逻辑比较独立评估。有关更多信息,请参阅about_logical_operators
Windows PowerShell逻辑运算符仅评估语句 需要确定声明的真值。如果是左操作数 在包含和运算符的语句中,右操作数为FALSE 没有评估。如果左边的操作数包含在一个语句中 或者语句为TRUE,不评估右操作数。结果是, 您可以按照使用的方式使用这些语句 If语句。
此外,由于删除文件而不删除文件夹-Recurse
Remove-Item
似乎没必要。
来自Alroc的评论:假设您拥有PowerShell的第3版或更高版本,您可以使用-File
的{{1}}参数代替Get-ChildItem
!$_.PSIsContainer
子句来简化此操作(这是第2版中常见的内容。)就像你在评论中所做的那样:
Where-Object