Suppress automatic confirmation of deletion in powershell

試著忘記壹切 提交于 2021-01-29 07:35:04

问题


I am trying to write a silent script that deletes files older than 14 days and removes empty folders. The part that deletes files work fine, but the part that deletes folders is popping up a confirmation window no matter what I do to suppress it. Here's my code:

$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
}

Most of the answers I have found say to add -Recurse to my final Remove-Item command, but that would be the opposite of what I want. If the folder is empty, I want it removed. If it is not empty, I do not want it removed. I'm not sure why non-empty folders are even being caught in the first place.

UPDATE

After much frustration, I discovered that the second line was processing items in reverse order, thus requiring confirmation. It was also not properly identifying empty folders, which also triggered confirmation. I ended up using the following function.

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
}

I put it here because while it is a solution (it erases files and folders to my satisfaction), it is not an answer to my posted question.


回答1:


If you are using v3 or higher powershell client you can use the -directory and -file switches for Get-ChildItem and use this:

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
}

Yes, I added -Recurse to the folder removal because with my testing no folders with any files in them were being passed to that point, and if it is a folder with nothing but empty folders in it then they all need to go anyway right?




回答2:


Remove -Force from first Get-ChildItem and add -Recurse and -Confirm:$false. This will work:

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


来源:https://stackoverflow.com/questions/22819987/suppress-automatic-confirmation-of-deletion-in-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!