关于PowerShell -ErrorAction Ignore 的 Bug

背景

有需求要清除指定目录的磁盘,我们这么实现

function Run-test{
    ls X:\doc | rm -Recurse -Force
}

Run-test

如果目录不存在,则会出现错误

但是根据业务,找不到就找不到,这个操作并不影响主流程。
所以,我们这么修改

function Run-test{
    [CmdletBinding()]
    param()
   
    ls X:\doc | rm -Recurse -Force
}

Run-test -ErrorAction Ignore

很合理,对吧
看结果:

看文档

上面错误信息也提示了文档,我们打开看看

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-7.2#erroractionpreference

看重点:

The $ErrorActionPreference variable takes one of the ActionPreference enumeration values: SilentlyContinue, Stop, Continue, Inquire, Ignore, Suspend, or Break.

Ignore: Suppresses the error message and continues to execute the command. The Ignore value is intended for per-command use, not for use as saved preference. Ignore isn't a valid value for the $ErrorActionPreference variable.

这到底是能还是不能?

验证

明显的,通过-ErrorAction Ignore是不行的,那么我们直接设置变量$ErrorActionPreference 呢?

function Run-test{
    [CmdletBinding()]
    param()
   
    $ErrorActionPreference ="Ignore"
    ls X:\doc | rm -Recurse -Force
}

Run-test

结果看,生效了。没有任何错误,$Error中也没有写入错误信息。

bug无疑了

搜了下还真搜到了:

https://github.com/PowerShell/PowerShell/issues/1759

解决方案

大家讨论的过程中也提到临时的workaround:

function Run-test{
    [CmdletBinding()]
    param()
   
   if($ErrorActionPreference -eq "Ignore")
   {
        $ErrorActionPreference ="Ignore"
   }
    
   ls X:\doc | rm -Recurse -Force
}

Run-test -ErrorAction Ignore
posted @ 2022-11-07 13:30  talentzemin  阅读(44)  评论(0编辑  收藏  举报