您可以在PowerShell中使用位置参数吗?

时间:2018-07-07 00:34:07

标签: powershell syntax parameter-passing

PowerShell是否支持使用位置参数而不是命名参数?

1 个答案:

答案 0 :(得分:5)

PowerShell的自变量展开(请参阅Get-Help about_Splatting)提供了两个基本选择:

  • 通过哈希表 进行拼写:适用于 命名自变量
  • 通过数组 进行拼写:仅用于 positioning 自变量 -< 非高级函数中的em> except ,它们通过@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>单个参数-这种格式不需要太多外部命令行实用程序可以识别。