Powershell splatting:在哈希表中传递 ErrorAction = Ignore

问题描述

这是一个列出在命令行上传递的目录/文件的脚本——无论是否递归:

param( [switch] $r )
@gci_args = @{
  Recurse = $r
  ErrorAction = Ignore
}
$args | gci @gci_args 

在这不起作用,因为忽略被解释为文字。传递 ErrorAction 的规范方式是什么?

我看到 "Ignore" 和(在 PS7 中){ Ignore } 都用作值,但似乎都没有对我的用例产生影响(在 Linux 下创建的错误文件名,它会停止 PS5,不管ErrorAction,但根本不会打扰 PS7)。所以我什至不确定这个参数有什么影响。

解决方法

因为 Ignore 被解释为文字

不,Ignore 被解释为要执行的命令,因为它是在参数模式(命令调用,像 shell)而不是表达式模式(像传统的编程语言) - 请参阅 this answer 了解更多信息。

虽然使用 [System.Management.Automation.ActionPreference] 枚举值显式,如在 filimonic's helpful answer 中,绝对是一个选项,您可以利用 PowerShell 自动转换回来的事实在 enum 值与其符号字符串表示之间来回切换。

因此,您可以使用 string 'Ignore' 作为 [System.Management.Automation.ActionPreference]::Ignore 的更方便的替代:[1]

$gci_args = @{
  # ... 
  ErrorAction = 'Ignore'
}

请注意,引用 ('...') 向 PowerShell 发出信号,表明应该使用 expression-mode 解析,即令牌是一个字符串文字而不是一个命令。

另请注意,-ErrorAction 仅对非终止错误起作用(但是,这是典型的类型) - 有关详细信息,请参阅 this answer


至于发现允许的 -ErrorAction 值:

  • 概念性的 about_CommonParameters 帮助主题涵盖了所有常见参数,其中 -ErrorAction 就是其中之一。

  • 许多常用参数都有相应的偏好变量(它们接受相同的值),包含在about_Preference_Variables中,允许您预设常用参数.

  • 交互,您可以使用制表符补全来查看允许的值(作为不带引号的符号名称,您只需将其用引号括起来即可);例如:

    # Pressing the Tab key repeatedly where indicated 
    # cycles through the acceptable arguments.
    Get-ChildItem -ErrorAction <tab> 
    

[1] 请注意,如果上下文明确要求特定的 enum 类型,例如在这种情况下,使用字符串并不意味着放弃类型安全。考虑到 PowerShell 是一种解释性语言,验证仅在运行时发生。
但是,支持 PowerShell 的编辑器(例如带有 PowerShell 扩展的 Visual Studio Code)可能会在设计时标记不正确的值。然而,从 2020.6.0 版本开始,情况似乎并非。不过幸运的是,tab-completion 和 IntelliSense 可以按预期工作,所以问题可能不会出现。
也就是说,正如 zett42 指出的那样,在为后者定义散列表条目的上下文中,预期类型尚不清楚,因此显式使用 [System.Management.Automation.ActionPreference] 确实具有优势:(a) IntelliSense在编辑器中可以指导您,并且 (b) - 假设 Set-StrictMode -Version 2 或更高版本有效 - 我们将在运行时更早报告无效值,即在分配,使故障排除更容易。从 PowerShell 7.1 开始,关于 Set-StrictMode -Version 2 或更高版本的警告是,您将无法在没有原生类型的对象上使用内在(PowerShell 提供的).Count 属性,因为到 GitHub issue #2798 中描述的错误。

,

我认为最好的方法是使用原生类型。

$ErrorActionPreference.GetType().FullName # System.Management.Automation.ActionPreference

所以,使用

$gci_args = @{   
  Recurse = $r
  ErrorAction = [System.Management.Automation.ActionPreference]::Ignore
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...