【问题标题】:In powershell, is it possible to enforce naming of arguments?在powershell中,是否可以强制参数命名?
【发布时间】:2019-07-27 19:41:26
【问题描述】:

给定一个脚本 foo.ps1:param($x,$y) return $x/$y

是否可以在调用时强制显式参数命名?

./foo.ps1 5 10 会产生错误 ./foo.ps1 -x 5 -y 10 就可以了

【问题讨论】:

    标签: powershell


    【解决方案1】:

    此代码有效,但它使用了未记录的内容(我找不到任何关于负面位置的信息):

    function Test
    {
        param(
            [Parameter(Position=-1)]
            $x
            ,
            [Parameter(Position=-1)]
            $y
        )
        $x/$y
    }
    
    Test -x 1 -y 2
    Test -y 2 -x 1
    Test 1 2
    

    输出:

    0.5
    0.5
    Test : Cannot bind positional parameters because no names were given.
    At C:\TEMP\_110127_170853\q1.ps1:15 char:5
    

    【讨论】:

    • 有趣。我几乎喜欢在虚拟参数上使用 -1 的想法,即使它没有记录。投票给你的答案。
    • 我玩了一下这个,结果证明有点不友好。当您尝试使用位置参数时显示的错误不会告诉您参数名称是什么。更糟糕的是,如果你“get-help test”,get-help 会显示 index out of range 错误。
    【解决方案2】:

    如果您使用 PowerShell V2 高级函数位置属性指定位置,所有参数默认为非位置,除非为其他参数指定位置属性(来源:PowerShell In Action 2nd pg 296)。所以你可以这样做:

    function Test-Args
    {
        param(
        [parameter(Position=0)] $dummy,
        $x,
        $y
        )
        $x/$y
    }
    

    【讨论】:

    • 但是你能否通过脚本参数将参数传递给被调用脚本中的高级函数,并让高级函数知道它们在传递给脚本时是最初的位置还是命名?
    • 脚本也可以实现位置属性。如果我将该函数转换为名为 test--arg1.ps1 的脚本(工作方式相同: param( [parameter(Position=0)] $dummy, $x, $y ) $x/$y
    • 好的。我还是更喜欢我的。我尝试了使用位置参数的脚本,并且 ./foo -x 5 10 尝试运行,但引发了除以零异常。使用虚拟参数将 $x 和 $y 括起来,并测试所有 4 个参数会强制您使用 -x 和 -y。
    • 除非我对原始问题的解释不正确,否则这正是他想要的,即强制 -x 和 -y 而位置将失败。
    • 我猜被零除异常被认为是“失败”。
    【解决方案3】:

    您可以在 CmdletBinding 参数中指定它。 即使将 PositionalBinding 设置为 $false,您仍然可以将位置分配给您的参数。 PowerShell 将不再自动为您的参数分配位置,因此所有参数都被命名,除非另有说明。

    function foo {
        [CmdletBinding(PositionalBinding=$false)]
    
        param (
    
            [Parameter()]
            [String]$a,
    
            [Parameter(Position=0)]
            [String]$a,
        )
    }
    

    【讨论】:

      【解决方案4】:

      我将在 foo.ps1 中使用这个。除非有人设法明确使用 -dummy1 或 -dummy2 来指定参数,否则它应该可以正常工作。

      param($dummy1,$x,$y,$dummy2)
      if (!$x -or !$y -or $dummy1 -or $dummy2){
      "Error: specify -x and -y explicitly"
      }
      else {$x/$y}
      

      【讨论】:

        猜你喜欢
        • 2013-10-08
        • 2018-11-06
        • 2012-07-03
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        相关资源
        最近更新 更多