PowerShell是否支持使用位置参数而不是命名参数?
答案 0 :(得分:5)
PowerShell的自变量展开(请参阅Get-Help about_Splatting
)提供了两个基本选择:
@Args
将所有 [unbound]个参数传递给另一个命令,在这种情况下,命名的参数也可以识别(即,通过展开包含所有未绑定参数的自动$Args
数组)。注意:当将参数传递给 PowerShell cmdlet /函数(带有声明的参数)时,此二分法适用,而外部程序执行它们自己的参数解析,这可能会也可能不会解释以名称传递的参数集。 [1]
也就是说,您可以结合使用常规的,单独的参数传递的任何形式-使用各个位置参数,各个命名参数,散列表和数组的任意组合-泼溅。
在两种情况下,源数据结构必须为:
已存储在一个变量中。
已引用,而不是@
,而使用 Sigil $
。
示例:
# Positional binding via *array*.
# Note that a function's / script block's parameters are by default positional.
PS> $posArgs = 'one', 'two'; & { param($foo, $bar) "`$foo: $foo"; "`$bar: $bar" } @posArgs
$foo: one
$bar: two
# Named binding via *hashtable*
PS> $namedArgs=@{bar='two';foo='one'}; & { param($foo, $bar) "`$foo: $foo"; "`$bar: $bar" } @namedArgs
$foo: one
$bar: two
# *Combining* hashtable splatting with a regular, positional argument
PS> $namedArgs=@{bar='two'}; & { param($foo, $bar) "`$foo: $foo"; "`$bar: $bar" } @namedArgs one
$foo: one
$bar: two
[1]使用外部程序:
通常,您在调用外部程序时不需要 喷洒,因为:
您可以按原样传递数组(使用常规的$
标记)
唯一的例外是是否要在参数数组中包含停止解析符号%--
(请参阅Get-Help about_Parsing
;您确实需要使用{{1} }在该事件中保持警惕。
使用单个数组元素满足外部程序的语法要求,包括其命名参数(如果有的话)
(例如,@
执行$args = '/c', 'ver'; cmd $args
)。
哈希表splats 转换为命令行令牌的方式可能会或可能不会被外部程序识别:
cmd /c ver
和值<paramName>
的哈希表条目转换为格式为<value>
的单个参数-这种格式不需要太多外部命令行实用程序可以识别。