2012-12-04 25 views
0

因此,我正在嘗試編寫一個使用開關參數的腳本,並且還需要參數。因此,例如,Powershell:包含參數的開關的函數

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

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

    $X + $Z/$Yup 

} 

Essentialy我要問,如果開關是存在的,那麼,如果它的存在,我希望它使用$ Yarg變量,目前當我這樣做,我得到一個錯誤說交換機只能是一個布爾值。然後其餘的代碼失敗。有任何想法嗎?

回答

2

我的假設是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 
) 

我希望的語法應該是顯而易見的。

+1

這推動了我更多的進一步,但現在我再次卡住了。 – user100541

+0

好吧,所以這工作得很好,它只是我正在使用的參數類型的問題。我大部分時間並不需要使用開關。使用非強制性變量更是如此。所以代替上述代碼我用這樣的: '函數foo( [列出CmdletBinding(defaultparametersetname = 「SETY」)] PARAM( [參數(強制性= $真,位置= 0)] $ X, [參數(強制性= $真,位置= 1)] $ Y [參數(強制性= $假)] $ Y, [參數(強制性= $假)] $ K, ) #做工作 )' 感謝您的幫助! – user100541

+1

啊,所以你很困惑-parameterName:parameterValue與開關。這些不是開關;他們是「命名參數」。交換機沒有參數(除非你明確提供了一個像-myswitch:$ true或-myswitch:$ false這樣的布爾值)。 – x0n

0

那麼,我打算做是做,你輸入的變量,像這樣

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 
) 

這似乎更容易,它的工作原理!