2011-03-28 68 views
5

我正在學習powershell函數及其驗證參數。不過,我不明白它們是否真的有用。驗證參數真的有用嗎?

我舉一個簡單的例子。

function get-choice(
[parameter(Mandatory=$true)][String][ValidateSet('Y','N')]$choice 
) 
{return $choice} 

get-choice k 

該函數返回我這個錯誤:

get-choice : Impossibile convalidare l'argomento sul parametro 'choice'. L'argomento "k" non appartiene al set "Y,N" specificato dall'attributo ValidateSet. Fornire un argomento inclu 
so nel set ed eseguire di nuovo il comando. 
In riga:6 car:11 
+ get-choice <<<< k 
    + CategoryInfo   : InvalidData: (:) [get-choice], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationError,get-choice 

如果我沒有指定一個有效的設定值的,我可以我的代碼中檢查他們:

function get-choice2(
[parameter(Mandatory=$true)][String]$choice 
) { 
    if($choice -ne 'y' -and $choice -ne 'n') { 
     write-host "you must choose between yes and no" 
     return 
    } 
return $choice 
} 

get-choice2 k 

和我更友好的信息:

you must choose between yes and no 

首先我想知道是否可以使用validateset自定義錯誤消息。然後我希望有人能解釋爲什麼我不得不喜歡第一種方法。提前致謝。

回答

6

一些原因使用標準的驗證:

  • 聲明代碼;更容易閱讀那麼if聲明
  • 短得多(4行代碼相比,只有return聲明1線)
  • 自定義代碼可以有一些錯誤
  • 在PowerShell中的Vx的以後可能會有一些定製驗證消息(只是在做夢)
  • ...

檢查Better error messages for PowerShell ValidatePattern(?) - 發佈者@jaykul。你會看到你如何定製錯誤信息。這是一個有點面向開發人員,但值得一讀。

+0

我也會說,來自ValidateSet的錯誤信息比任何你可以做的事都要友好得多。如果您的用戶使用PowerTab Plus Plus,則ValidateSet會添加一些選項卡擴展功能。 – JasonMArcher 2011-03-29 04:33:17

+0

謝謝你veru很多stej。你的解釋很清楚。我閱讀了這個鏈接,但它不符合我目前的知識。再次感謝 :) – 2011-03-29 09:19:59

2

使用參數驗證的優點是您不必親自操作。這是很多無聊的樣板代碼,不再需要編寫和測試。在我的書中取得了巨大的勝利,儘管它會導致不太友好的錯誤消息。

你可以寫一些幫助文檔,爲您的功能,使用戶可以鍵入help get-choice2,看看什麼是參數的說明:瞭解更多詳情

function get-choice(
[parameter(Mandatory=$true)][String][ValidateSet('Y','N')]$choice 
) 
{ 
    <# 
    .SYNOPSIS 
    Gets the user's choice. 

    .PARAMETER choice 
    The choice. Must be Y or N. 
    #> 

    return $choice 
} 

運行help about_comment_based_help,或見MSDN documentation

+0

+1即使你對我獻身的時候,也要感謝你。 – 2011-03-29 09:20:32