关于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
很合理,对吧
看结果:
看文档
上面错误信息也提示了文档,我们打开看看
看重点:
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无疑了
搜了下还真搜到了:
解决方案
大家讨论的过程中也提到临时的workaround:
function Run-test{
[CmdletBinding()]
param()
if($ErrorActionPreference -eq "Ignore")
{
$ErrorActionPreference ="Ignore"
}
ls X:\doc | rm -Recurse -Force
}
Run-test -ErrorAction Ignore