【问题标题】:Powershell: Functions with switches that include argumentsPowershell:带有包含参数的开关的函数
【发布时间】:2012-12-04 14:08:34
【问题描述】:

所以我正在尝试编写一个使用开关参数的脚本,并且我还需要参数来配合它们。比如,

Function Foo ($X, $Z, [switch]$Y, $Yarg, [switch]$K, $Karg){
  if($Y){
    $Yup = $Yarg
  }

  if($K){
    $Y = $Karg
  }Else{$Y = 42}

  $X + $Z / $Yup

}

本质上我想问一下开关是否在那里,如果它在那里,我希望它使用 $Yarg 变量,目前当我这样做时,我得到一个错误,说开关只能是一个布尔值。然后其余代码失败。有什么想法吗?

【问题讨论】:

    标签: function powershell windows-7 parameters


    【解决方案1】:

    我的假设是 Y 和 K 是互斥的参数集,而 X 和 Z 是共同的,并且是强制性的。如果既未指定 -Y 也未指定 -K,则默认值为 -Y。为了清楚起见,我在这里使用了备用参数声明语法:

    function Foo(
        [cmdletbinding(defaultparametersetname="setY")]
        param(
            [parameter(mandatory=$true)]
            $X,
    
            [parameter(mandatory=$true)]
            $Y
    
            [parameter(parametersetname="setY")]
            [switch]$Y,
    
            [parameter(parametersetname="setY", mandatory=$true)]
            $YArg,
    
            [parameter(parametersetname="setK")]
            [switch]$K,
    
            [parameter(parametersetname="setK", mandatory=$true)]
            $KArg,
        )
        # do work
    )
    

    我希望语法应该是显而易见的。

    【讨论】:

    • 这把我推得更远了,但现在我又卡住了。
    • 好的,所以这工作得很好,它只是最终成为我使用的参数类型的问题。在大多数情况下,我真的不需要使用 Switch。使用非强制性变量更是如此。所以我用这个代替了上面的代码:function Foo( [cmdletbinding(defaultparametersetname="setY")] param( [parameter(mandatory=$true, position=0)] $X, [parameter(mandatory=$true, position=1)] $Y [parameter(mandatory=$false)] $Y, [parameter(mandatory=$false)] $K, ) # do work ) 感谢您的帮助!
    • 啊,所以您将 -parameterName:parameterValue 与开关混淆了。这些不是开关;它们是“命名参数”。开关没有参数(除非您明确提供像 -myswitch:$true 或 -myswitch:$false 这样的布尔值)。
    【解决方案2】:

    所以我打算做一个函数,你可以输入这样的变量

    foo x z -y yarg -k karg
    

    主要是想要 -y yarg 类型的变量入口。

    为了能够做到这一点,我认为我需要使用开关,但实际上我只需要非强制性参数。

       function Foo(
        [cmdletbinding(defaultparametersetname="setY")]
        param(
            [parameter(mandatory=$true, position=0)]
            $X,
    
            [parameter(mandatory=$true, position=1)]
            $Z
    
            [parameter(mandatory=$false)]
            $Y,
    
            [parameter(mandatory=$false)]
            $K
        )
        # do work
    )
    

    这似乎更容易,而且有效!

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2021-09-04
      • 2022-01-22
      • 2011-10-05
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多