【问题标题】:Can you splat positional arguments in PowerShell?你能在 PowerShell 中使用位置参数吗?
【发布时间】:2018-12-15 13:45:02
【问题描述】:

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

【问题讨论】:

  • 是什么引发了这个问题?
  • 编写脚本并构建命令参数。想要避免使用Invoke-Command,意识到我有一些未命名的位置参数(无论如何都没有以- 为前缀)。
  • 我相信我在stackoverflow.com/questions/50472772 的回答应该对你有用(你可以忽略反对票)。

标签: powershell syntax parameter-passing


【解决方案1】:

PowerShell 的argument splatting(参见Get-Help about_Splatting)提供了两种基本选择:

  • 通过 散列表 喷溅:适用于命名参数(例如,@987654326 @
  • 通过类似数组的值:适用于位置参数(例如, C:\Windows) - exceptnon-advanced 函数中将 所有 [未绑定] 参数通过 传递给另一个命令 通过@args(即,通过喷射包含所有未绑定参数的automatic $args array variable),在这种情况下,也支持命名参数,因为只有@args 内置了魔法。

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

也就是说,您可以结合任何一种形式与常规的单个参数传递 - 使用单个位置参数、单个命名参数、散列表喷溅和数组的任意组合-喷溅。

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

  • 预先存储在变量中。

  • 引用 sigil @ 而不是 $

注意:RFC 中详述的未来增强功能可能会带来直接 splat 表达式的能力,而无需中间变量,尽管从 PowerShell Core 7 开始尚不清楚何时实现。


示例

# 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] 外部程序

一般来说,当你调用外部程序时,你确实不需要 splatting,因为:

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

    • 唯一的例外是如果您想在参数数组中包含%--,停止解析符号(请参阅Get-Help about_Parsing;您确实需要在该事件中使用@ sigil。

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

  • hashtable splats 被翻译成命令行标记的方式可能会或可能不会被外部程序识别:

    • 具体来说,带有键 <paramName> 和值 <value> 的哈希表条目被转换为格式为 -<paramName>:<value>单个 参数 - 很少有外部命令行实用程序能够识别这种格式。李>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2019-05-03
    相关资源
    最近更新 更多