2

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

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

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

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

4

2 回答 2

3

因为Ignore被解释为文字

不,Ignore被解释为要执行的命令,因为它是在参数模式(命令调用,如 shell)而不是表达式模式(如传统编程语言)中解析的 - 有关更多信息,请参阅此答案

虽然明确使用[System.Management.Automation.ActionPreference]枚举值(如filimonic 的有用答案)绝对是一种选择,但您可以利用PowerShell 自动在值及其符号字符串表示之间来回转换的事实。enum

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

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

请注意,引号( '...') 向 PowerShell 发出信号,表明应该使用表达式模式解析,即标记是字符串文字而不是命令。

另请注意,-ErrorAction仅对非终止错误进行操作(但是,这是典型的错误)-有关更多信息,请参见此答案


至于允许值的发现:-ErrorAction

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

  • 许多常用参数都有对应的首选项变量(接受相同的值),包含在 中about_Preference_Variables,允许您预设常用参数。

  • 交互式地,您可以使用tab-completion来查看允许的值(作为不带引号的符号名称,您只需用引号括起来);例如:

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

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

于 2021-02-09T18:45:06.107 回答
2

我认为最好的方法是使用本机类型。

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

所以,使用

$gci_args = @{   
  Recurse = $r
  ErrorAction = [System.Management.Automation.ActionPreference]::Ignore
}
于 2021-02-09T17:35:05.793 回答