你能在PowerShell中展开位置参数吗?

Ben*_*est 1 syntax powershell parameter-passing

PowerShell是否支持位置参数的splatting而不是命名参数?

mkl*_*nt0 5

PowerShell的参数splatting(参见参考资料Get-Help about_Splatting)提供了两个基本选择:

  • 通过哈希表进行splatting:适用于命名参数
  • 通过数组 splatting:用于位置参数 - 除非非高级函数中将所有 [未绑定]参数传递到另一个命令@Args,在这种情况下也会识别命名参数(即,通过splatting $Args包含所有所有未绑定的自动数组)参数).

注意:当将参数传递给PowerShell cmdlet/functions(带有声明的参数)时,这种二分法适用,而外部程序执行自己的参数解析,这可能会也可能不会解释作为命名传递的参数集.[1]

也就是说,您可以表单与常规的单个参数传递相结合 - 使用单个位置参数,单个命名参数,哈希表 - splatting和数组splatting的任意组合.

在这两种情况下,源数据结构必须是:

  • 预先存储在变量中.

  • 引用印记@代替$.


示例:

# 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     
Run Code Online (Sandbox Code Playgroud)

[1]与外部程序一起飞溅:

一般来说,你不会需要泼溅,当你调用外部程序,这是因为:

  • 您可以按原样传递数组(使用通常的$sigil)

    • 唯一的例外是如果你想要包含%--停止解析符号(参见Get-Help about_Parsing参数数组;你需要@在那个事件中使用sigil).

    • 使用单个数组元素来满足外部程序的语法要求,包括其命名参数(如果有)
      (例如,$args = '/c', 'ver'; cmd $args执行cmd /c ver).

  • 的方式散列表提示图标被翻译成命令行令牌可以或可以不通过外部程序确认:

    • 具体来说,带有键<paramName>和值的哈希表条目<value>被转换为格式化为的单个参数-<paramName>:<value>- 一种没有太多外部命令行实用程序识别的格式.