參數

已完成

建立幾個指令碼之後,您可能會注意到您的指令碼沒有彈性。 進入您的指令碼進行變更沒有效率。 有更好的方法可以處理變更:使用參數。

使用參數可讓您的指令碼有彈性,因為其可讓使用者選取選項或將輸入傳送至指令碼。 您不需要經常變更指令碼,因為在某些情況下,您只需要變更參數值。

Cmdlet、函數和指令碼全都接受參數。

宣告並使用參數

若要宣告參數,您必須使用關鍵字搭配 Param 左括弧和右括弧:

Param()

在括弧內,您可以定義參數,並以逗號分隔。 一般的參數宣告可能如下所示:

# CreateFile.ps1
Param (
  $Path
)
New-Item $Path # Creates a new file at $Path.
Write-Host "File $Path was created"

指令碼有一個 $Path 參數,稍後在指令碼中用來建立檔案。 指令碼現在更有彈性。

請使用參數

若要使用參數呼叫指令碼,您需要提供名稱和值。 假設上述指令碼稱做 CreateFile.ps1。 您可以呼叫,就像這樣:

./CreateFile.ps1 -Path './newfile.txt' # File ./newfile.txt was created.
./CreateFile.ps1 -Path './anotherfile.txt' # File ./anotherfile.txt was created.

因為您使用參數,所以當您想要呼叫檔案時,不需要變更指令碼檔案。

注意

因為這個特定的指令碼只會呼叫 New-Item,所以不會因為使用參數而受益。 只要您的指令碼只有幾行,使用參數就會有回報。

改善您的參數

當您使用參數第一次建立指令碼時,您可能會忘記確切的參數用途,以及其合理值。 經過一段時間後,您可能會忘記這些細節。 建議您將指令碼提供給同事。 這些案例中的解決方法是要明確,讓您的指令碼更容易使用。 如果指令碼傳遞了不合理的參數值,您會讓指令碼提早失敗。 以下是一些當您定義參數時,要考慮的事項:

  • 這是必要的嗎? 參數是選擇性或必要的?
  • 允許哪些值? 合理的價值為何?
  • 其是否接受一種以上的值? 參數是否接受任何類型的值,例如字串、布林值、整數和物件?
  • 參數是否可以依賴預設值? 您可以完全省略值,並改為依賴預設值?
  • 您可以進一步改善使用者體驗嗎? 藉由提供說明訊息,您可以更清楚地瞭解您的使用者嗎?

選取方式

依預設,所有參數都為選用。 該預設在某些情況下可能適用,但有時候您需要使用者提供參數值,而且值必須是合理的值。 如果使用者未提供值給參數,則指令碼應該會結束,或告訴使用者如何修正問題。 最糟情況的是,指令碼繼續進行,並繼續執行您不想要執行的動作。

您可以使用幾種方法來更安全地執行指令碼。 您可以寫入自訂程式碼來檢查參數值。 或者,您也可以使用裝飾項目,這種做法大致相同。 讓我們看看這兩種方法。

  • 使用 If/Else。 此 If/Else 建構可讓您檢查參數的值,然後決定該怎麼做。 以下為範例:

    Param(
       $Path
    )
    If (-Not $Path -eq '') {
       New-Item $Path
       Write-Host "File created at path $Path"
    } Else {
       Write-Error "Path cannot be empty"
    } 
    

    如果您未提供 $Path 的值,指令碼將會執行 Write-Error

  • 使用 Parameter[] 裝飾項目。 更好的方法是,需要較少的輸入,就是使用裝飾項目 Parameter[]

    Param(
       [Parameter(Mandatory)]
       $Path
    )
    New-Item $Path
    Write-Host "File created at path $Path"
    

    如果您執行此指令碼並省略 $Path 的值,最後會出現對話方塊,提示您輸入值:

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    Path:
    

    您可以藉由提供使用者在執行指令碼時所看到的說明訊息,來改善此裝飾項目:

    [Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
    

    當您執行指令碼時,您會看到一則訊息,告訴您輸入 !? 以取得更多詳細資訊:

    cmdlet CreateFile.ps1 at command pipeline position 1
    Supply values for the following parameters:
    (Type !? for Help.)
    Path: !?  # You type !?
    Please provide a valid path  # Your Help message.
    
  • 指派類型。 例如,如果您將類型指派給參數,則可以說,參數只接受字串,而不接受布林值。 如此一來,使用者就知道預期的結果。 您可以將類型指派給參數,方法是在其前面加上括弧括住的類型:

    Param(
       [string]$Path
    )
    

這三種方法並不會互斥。 您可以將其結合,讓指令碼更安全。