2016-01-29 32 views
0

我試圖編寫一個失敗簡單的腳本利用參數集來簡化輸入和驗證。我想腳本是這樣的:多個參數集不工作

.\zipandrotate.ps1 -Zip [-AllButDays <int>] -Rotate [-MaxRetentionDays <int>] 

-Zip因此-AllButDays是可選的是-Rotate-MaxRetentionDays

我曾嘗試設置一個默認參數設置爲zip,但沒有奏效。我希望它允許執行:只需壓縮,旋轉或同時壓縮和旋轉。

[CmdletBinding(DefaultParameterSetBame="zip")] 
param(
    [Parameter(Mandatory=$false, ParameterSetName="zip")] 
    [Switch]$Zip, 

    [Parameter(Mandatory=$true, ParameterSetName="rotate")] 
    [Switch]$Rotate, 

    [Parameter(ParameterSetName="zip", Mandatory=$true)] 
    [int]$AllButDays, 

    [Parameter(ParameterSetName="rotate", Mandatory=$false)] 
    [int]$MaxRetentionDays 
) 

我碰到下面的錯誤在PowerShell中5(視窗10)和PowerShell 4(Windows 7)中:

PS C:\>.\zipandrotate.ps1 -Zip -AllButDays 2 -Rotate -MaxRetentionDays 2 
C:\zipandrotate.ps1 : Parameter set cannot be resolved using the specified named 
parameters. 
At line:1 char:1 
+ .\zipandrotate.ps1 -Zip -AllButDays 2 -Rotate -MaxRetentionDays 2 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [zipandrotate.ps1], ParameterBindingException 
    + FullyQualifiedErrorId : AmbiguousParameterSet,zipandrotate.ps1

運行命令三種不同的方式告訴我,問題是在試圖用-Zip-Rotate在同一時間。

作品:

.\zipandrotate.ps1 -zip -allbutdays 2 
.\zipandrotate.ps1 -rotate -maxretentiondays 90 

不起作用:

.\zipandrotate.ps1 -zip -allbutdays 2 -rotate -maxretentiondays 90 

因此,有4路我看到我的劇本去:

允許:只是壓縮,只需旋轉,兩者
不允許:無

有關我如何獲得的任何建議 那裏?添加第三個參數集可以改變這種情況。只有-Zip-Rotate工作;個人使用不再有任何獨特的情況來確定他們是哪個參數集。有沒有辦法獲得我想要刪除一個額外的參數運行-Zip-Rotate單獨的功能?

+0

如果這是唯一需要的值,那麼您可以將每個組合嗎? '-ZipAllButDays:2'? – Eris

回答

0

我不認爲你所要求的可以用靜態參數集來實現。您將不得不在該函數內使用dynamic parameters或其他驗證代碼。

但是,我不認爲我會首先將腳本參數化。您的參數由兩個開關組成,每個開關與一個參數相關聯。這意味着你可以完全放棄開關,只使用參數。因爲你似乎想要實現日誌旋轉或者沿着這些方向,我可能會使這兩個參數都是可選的,併爲它們提供默認值。像這樣:

[CmdletBinding()] 
param(
    [Parameter(Mandatory=$false)] 
    [ValidateRange(1,120)] 
    [int]$MaxRetention = 30, # days 

    [Parameter(Mandatory=$false)] 
    [ValidateRange(1,30)] 
    [int]$CompressAfter = 2 # days 
) 
+0

感謝您的回答。我要深入探討動態參數,看看我能否在那裏做我想做的事。 –