代码之家  ›  专栏  ›  技术社区  ›  codewario

你能在powershell中显示位置参数吗?

  •  1
  • codewario  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   mklement0    6 年前

    powershell的 争吵 (见 Get-Help about_Splatting )提供两种基本选择:

    • 通过一个 哈希表 :适用于 命名的 论据 只有
    • 通过一个 阵列 -同类价值 :适用于 位置 论据 只有 - 除了 在里面 非高级 传递的函数 全部的 [解除绑定]参数通过 到另一个命令 通过 @Args ,在这种情况下 命名的 参数也被识别(即,通过将 $Args 包含所有未绑定参数的数组)。

    注意:当将参数传递给 powershell Cmdlet/函数(带有声明的参数),而 外部程序 执行它们自己的参数解析,这可能会也可能不会解释作为named传递的参数集。 [一]

    也就是说, 你可以 结合 任意一种形式,具有正则的、单独的参数传递 -使用单个位置参数、单个命名参数、哈希表splatting和数组splatting的任意组合。

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

    • 存储 在一个变量之前。

    • 参考 具有 西格尔 @ 而不是 $ .

    注意:一个未来的增强功能,详细内容如下 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,因为:

    • 你可以通过 按原样排列 (和往常一样 $ 西格尔)

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

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

    • 方法 哈希表splats 被转换为命令行标记可能被外部程序识别,也可能不被外部程序识别:

      • 具体地说,带有键的哈希表条目 <paramName> 和价值 <value> 被翻译成 单身 参数格式为 -<paramName>:<value> -外部命令行实用程序无法识别的格式。