在我的PowerShell脚本中,我尝试删除一个文件夹,但前提是该文件夹存在:

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


我发现自己重复了几次cmdlet组合,并且希望我有这样的东西:

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


有没有办法做类似的事情?可能是Remove-Item文档中缺少的其他命令或选项?还是将这些代码干燥掉的唯一方法是编写自己的结合了Test-PathRemove-Item的cmdlet?

评论

您可能正在寻找别名。

@Mast,别名只是命令的替代名称。您不能在别名定义中指定参数或任何其他内容。

#1 楼

我假设您只是想避免出现该错误消息而已。

如果忽略该错误怎么办:



 Remove-Item $folder -Recurse -ErrorAction Ignore
 


如果这不是您想要的,我建议您编写自己的函数:

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


评论


\ $ \ begingroup \ $
-ErrorAction忽略还将忽略安全错误。
\ $ \ endgroup \ $
– jpmc26
18-09-7在19:55



#2 楼

最好使用管道语法。如果没有文件,那么什么都不会发生:

Get-ChildItem $folder -Recurse | Remove-Item


评论


\ $ \ begingroup \ $
如果您希望-Recurse正常工作,则它应该在Remove-Item上,否则,除非其中没有文件,否则目录不会被删除。即使那样,它也不会删除$ folder,只会删除它的内容,所以它很好,但是有细微的差别。
\ $ \ endgroup \ $
–briantist
18年2月8日在14:23

\ $ \ begingroup \ $
不会删除空的$ folder
\ $ \ endgroup \ $
–arberg
18年6月15日在12:39

\ $ \ begingroup \ $
按完整路径对项目进行排序,然后反转列表,可以确保孩子在父母之前被删除,从而避免令人讨厌的“您确定吗?”提示。
\ $ \ endgroup \ $
– jpmc26
18年9月7日在19:57

#3 楼

如果无法删除文件,这也会删除一个空文件夹,并且仍然传播错误。

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


最正确的例外选择是if (test-path $p) { rm $p }版本