我正在尝试编写一个静默脚本,删除超过14天的文件并删除空文件夹。删除文件的部分工作正常,但删除文件夹的部分会弹出一个确认窗口,无论我做什么来抑制它。这是我的代码:
$date=(get-date).AddDays(-14)
$ConfirmPreference="None"
$DebugPreference="SilentlyContinue"
$ErrorActionPreference="SilentlyContinue"
$ProgressPreference="SilentlyContinue"
$VerbosePreference="SilentlyContinue"
$WarningPreference="SilentlyContinue"
$OutputEncoding=[console]::OutputEncoding
function FullNuke ([string] $strPath) {
Get-ChildItem -Path $strPath -Recurse -Force | Where-Object {!$_.PSIsContainer -and $_.LastAccessTime -lt $date} | Remove-Item -Force
#The line below is the one that triggers the confirmation
Get-ChildItem -Path $strPath -Recurse -Force | Where-Object {$_.PSIsContainer -and @(Get-ChildItem -LiteralPath $_.FullName -Recurse -Force | Where-Object {!$_.PSIsContainer}).Length -eq 0} | Remove-Item -Force
}
我发现的大多数答案都说要添加-Recurse到我的最终Remove-Item命令,但这与我想要的相反。如果文件夹为空,我希望将其删除。如果它不是空的,我不希望它被删除。我不确定为什么非空文件夹首先被捕获。
更新
在非常沮丧之后,我发现第二行是以相反的顺序处理项目,因此需要确认。它也没有正确识别空文件夹,这也触发了确认。我最终使用了以下功能。
function FullNuke ([string] $strPath) {
Get-ChildItem -Path $strPath -Recurse -Force | Where-Object {!$_.PSIsContainer} | Where-Object {$_.LastAccessTime -lt $date} | Remove-Item -Force
Get-ChildItem -Path $strPath -Recurse -Force | Where-Object {$_.PSIsContainer} | Where-Object {@(Get-ChildItem -LiteralPath $_.FullName -Recurse -Force).Length -eq 0} | Remove-Item -Force
}
我把它放在这里是因为虽然它是一个解决方案(它让我满意地删除文件和文件夹),但它不是我发布的问题的答案。
答案 0 :(得分:0)
如果您使用的是v3或更高版本的PowerShell客户端,则可以使用-directory和-file开关来使用Get-ChildItem并使用它:
function FullNuke ([string] $strPath) {
Get-ChildItem -Path $strPath -Recurse -Force -File | Where-Object {$_.LastAccessTime -lt $date} | Remove-Item -Force
Get-ChildItem -Path $strPath -Recurse -Force -Directory | Where-Object {(gci $_.FullName -File -Recurse -Force).count -eq 0} | Remove-Item -Force -Recurse
}
是的,我添加了-Recurse到文件夹删除,因为我的测试没有包含任何文件的文件夹被传递到那一点,如果它是一个只有空文件夹的文件夹,那么他们都需要去反正吧?
答案 1 :(得分:0)
从第一个-Force
移除Get-ChildItem
,然后添加-Recurse
和-Confirm:$false
。
这将有效:
Get-ChildItem -Path $strPath -Recurse |
Where-Object {$_.PSIsContainer -and
@(Get-ChildItem -LiteralPath $_.FullName -Recurse -Force |
Where-Object {!$_.PSIsContainer}).Length -eq 0} |
Remove-Item -Force -Recurse -Confirm:$false