37
\$\begingroup\$

In my PowerShell script I'm trying to delete a folder, but only if it exists:

if (Test-Path $folder) { Remove-Item $folder -Recurse; }

I find myself repeating this combination of cmdlets quite a few times, and wished I had something like this:

# Pseudo code:
Remove-Item $folder -Recurse -IgnoreNonExistentPaths

Is there a way to do something like that? A different command, or an option I've missed from the Remove-Item documentation perhaps? Or is the only way to DRY out this bit of code to write my own cmdlet that combines Test-Path and Remove-Item?

\$\endgroup\$
  • \$\begingroup\$ You may be looking for alias. \$\endgroup\$ – Mast May 11 '15 at 9:55
  • 1
    \$\begingroup\$ @Mast, an alias is just an alternative name for a command. You can't specify parameters or anything in an alias definition. \$\endgroup\$ – Dangph May 12 '15 at 0:53
52
\$\begingroup\$

I assume you're just trying to avoid the error message in case it doesn't exist.

What if you just ignore it:

Remove-Item $folder -Recurse -ErrorAction Ignore

If that's not what you want, I would recommend writing your own function:

function Remove-ItemSafely {
[CmdletBinding(SupportsShouldProcess=$true)]
param(
    [Parameter(
        Mandatory=$true,
        ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true
    )]
    [String[]]
    $Path ,

    [Switch]
    $Recurse
)

    Process {
        foreach($p in $Path) {
            if(Test-Path $p) {
                Remove-Item $p -Recurse:$Recurse -WhatIf:$WhatIfPreference
            }
        }
    }
}
\$\endgroup\$
  • 7
    \$\begingroup\$ -ErrorAction Ignore would also ignore security errors. \$\endgroup\$ – jpmc26 Sep 7 '18 at 19:55
5
\$\begingroup\$

It is better to use pipeline syntax. If there are no files, then nothing will happen:

Get-ChildItem $folder -Recurse | Remove-Item
\$\endgroup\$
  • \$\begingroup\$ The -Recurse should be on Remove-Item if you want it to work correctly, otherwise the directories won't be deleted unless they have no files inside. Even that way though, this won't delete $folder, only its contents, so it's good but subtly different. \$\endgroup\$ – briantist Feb 8 '18 at 14:23
  • \$\begingroup\$ does not delete an empty $folder \$\endgroup\$ – arberg Jun 15 '18 at 12:39
  • 1
    \$\begingroup\$ Sorting the items by full path and then reversing the list would ensure that children get deleted before their parents, preventing nasty "Are you sure?" prompts. \$\endgroup\$ – jpmc26 Sep 7 '18 at 19:57
3
\$\begingroup\$

This will delete an empty folder as well and still propagates errors if files cannot be deleted

Get-childItem .idea\caches -ErrorAction SilentlyContinue  | Remove-Item -Recurse

The most correct option for exceptions would be the if (test-path $p) { rm $p } version

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.