66
\$\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\$
2
  • \$\begingroup\$ You may be looking for alias. \$\endgroup\$
    – Mast
    May 11, 2015 at 9:55
  • 2
    \$\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, 2015 at 0:53

3 Answers 3

90
\$\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\$
1
  • 11
    \$\begingroup\$ -ErrorAction Ignore would also ignore security errors. \$\endgroup\$
    – jpmc26
    Sep 7, 2018 at 19:55
8
\$\begingroup\$

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

Get-ChildItem $folder -Recurse | Remove-Item
\$\endgroup\$
3
  • 1
    \$\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, 2018 at 14:23
  • \$\begingroup\$ does not delete an empty $folder \$\endgroup\$
    – arberg
    Jun 15, 2018 at 12:39
  • 2
    \$\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, 2018 at 19:57
4
\$\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 and acknowledge that you have read and understand our privacy policy and code of conduct.

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