參數
建立幾個指令碼之後,您可能會注意到您的指令碼沒有彈性。 進入您的指令碼進行變更沒有效率。 有更好的方法可以處理變更:使用參數。
使用參數可讓您的指令碼有彈性,因為其可讓使用者選取選項或將輸入傳送至指令碼。 您不需要經常變更指令碼,因為在某些情況下,您只需要變更參數值。
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 )
這三種方法並不會互斥。 您可以將其結合,讓指令碼更安全。