覆盖 PowerShell 参数的解析模式?
Override a PowerShell parameter's parsing mode?
假设这个函数:
function Get-Foo {
param(
[string[]]$Foos
)
Foreach ($Foo IN $Foos) {
Write-Host "Foo: $Foo"
}
}
使用字符串分隔符 ('
) 调用此函数会创建一个数组:
PS> Get-Foo -Foos 'ABC 1', 'DEF 2'
Foo: ABC 1
Foo: DEF 2
在没有分隔符的情况下调用它会产生错误:
PS> Get-Foo -Foos ABC 1, DEF 2
Get-Foo : A positional parameter cannot be found that accepts argument 'System.Object[]'.
At line:1 char:1
+ Get-Foo -Foos ABC 1, DEF 2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Foo], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Get-Foo
有没有办法覆盖参数的解析逻辑,使两种情况都能按预期运行?
没有。这不是函数定义的函数,这是语言被解析和解释的方式。
这些 类 实际上也可供您在 PowerShell 中使用,因此您可以看到它们是如何工作的,但更改它们并不是那么实用。您可以制作自己的解析器,然后使用 AST 来执行标记吗?但是你必须用你的自定义应用程序调用你的脚本。无论如何,该语法很可能是模棱两可的,这就是为什么不按原样支持它的原因。
Here are some examples of using the Abstract Syntax Tree (AST) in PowerShell from Doug Finke.
假设这个函数:
function Get-Foo {
param(
[string[]]$Foos
)
Foreach ($Foo IN $Foos) {
Write-Host "Foo: $Foo"
}
}
使用字符串分隔符 ('
) 调用此函数会创建一个数组:
PS> Get-Foo -Foos 'ABC 1', 'DEF 2'
Foo: ABC 1
Foo: DEF 2
在没有分隔符的情况下调用它会产生错误:
PS> Get-Foo -Foos ABC 1, DEF 2
Get-Foo : A positional parameter cannot be found that accepts argument 'System.Object[]'.
At line:1 char:1
+ Get-Foo -Foos ABC 1, DEF 2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Foo], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Get-Foo
有没有办法覆盖参数的解析逻辑,使两种情况都能按预期运行?
没有。这不是函数定义的函数,这是语言被解析和解释的方式。
这些 类 实际上也可供您在 PowerShell 中使用,因此您可以看到它们是如何工作的,但更改它们并不是那么实用。您可以制作自己的解析器,然后使用 AST 来执行标记吗?但是你必须用你的自定义应用程序调用你的脚本。无论如何,该语法很可能是模棱两可的,这就是为什么不按原样支持它的原因。
Here are some examples of using the Abstract Syntax Tree (AST) in PowerShell from Doug Finke.