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
?
-
\$\begingroup\$ You may be looking for alias. \$\endgroup\$Mast– Mast ♦2015年05月11日 09:55:33 +00:00Commented 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– Dangph2015年05月12日 00:53:53 +00:00Commented May 12, 2015 at 0:53
3 Answers 3
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
}
}
}
}
-
11\$\begingroup\$
-ErrorAction Ignore
would also ignore security errors. \$\endgroup\$jpmc26– jpmc262018年09月07日 19:55:54 +00:00Commented Sep 7, 2018 at 19:55
It is better to use pipeline syntax. If there are no files, then nothing will happen:
Get-ChildItem $folder -Recurse | Remove-Item
-
1\$\begingroup\$ The
-Recurse
should be onRemove-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– briantist2018年02月08日 14:23:37 +00:00Commented Feb 8, 2018 at 14:23 -
\$\begingroup\$ does not delete an empty $folder \$\endgroup\$arberg– arberg2018年06月15日 12:39:13 +00:00Commented 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– jpmc262018年09月07日 19:57:15 +00:00Commented Sep 7, 2018 at 19:57
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