Windows PowerShell:定義參數
在 Windows PowerShell 中定義參數的方法有簡有繁,兩者各有優點。
Don Jones
你也會經常寫一個腳本或接受某種形式的輸入所需要的功能。 這可能是一個電腦名稱稱、 檔路徑或任何類似的。 你可以告訴 Windows PowerShell 期望這些參數,收集他們從命令列中,並將它們的值放入您的腳本或函數內的變數。 這使得處理輸入的輕鬆和高效。
你只需要知道如何聲明您的參數。 這樣做最簡單的手段所以是參數塊:
Param( [string]$computerName, [string]$filePath )
你不必把它分解到單獨的行,像我做了。 它是合法的在單獨的一行上都放在一起運行它。 我更喜歡打破它為了便於閱讀,雖然。 作為的指令檔中或在函數內的程式碼,第一次使用時,Windows PowerShell 讀取這並將甚至完成選項卡上的參數名稱,當有人運行的腳本或函數。 我一直小心地使用參數的名稱:他們是 –computerName 和 –filePath 在這裡。 這些都是用於此類資訊的其他 Windows PowerShell Cmdlet 的很相似。 這樣一來,我的參數符合是什麼已經在外殼程式中。
如果我把這放在一個名為 Get Something.ps1 的腳本,將使用此類參數:
./Get-Something –computerName SERVER1 –filePath C:\Whatever
此外可以將參數名稱截斷。 這讓我鍵入更少的字元,他們仍然工作:
./Get-Something –comp SERVER1 –file C:\Whatever
我甚至可以完全省略名稱。 Windows PowerShell 將自動和 positionally 接受值。 在這裡我必須要小心,提供相同的順序,在我的檔中列出的參數的值:
./Get-Something SERVER1 C:\Whatever
當然,通過使用參數名稱,命令將變為一個人找出容易一點。 然後出現豪華的放在我想要的任何命令的參數:
./Get-Something –filePath C:\Whatever –computerName SERVER1
Windows PowerShell 還提供了一種更複雜的聲明參數方式。 此更成熟的語法,可以將參數定義為強制性,指定位置 (如果你不這樣做,然後該參數,只可按名稱) 和更多。 此擴展的語法也是法律中的腳本和功能:
[CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$computerName, [Parameter(Mandatory=$True)] [string]$filePath )
再次,您可以運行在一條線上的所有的在一起,但它分解,使得有點易於閱讀。 給了兩個我參數 [Parameter()] 裝飾,和他們兩個定義為強制性。
如果有人試圖運行我的腳本,並且忘記一個或兩個這些參數,外殼會自動提示他們。 沒有額外的工作,我需要讓其發生的部分。 我還定義了 –computerName 正處於第一位,但 –filePath 需要提供的名稱。
有一些其他優點使用 [CmdletBinding()] 指令。 一方面,它可以確保我的腳本或函數將具有的所有 Windows PowerShell 常見參數,包括 –Verbose 和 –Debug。 現在,我可以在我的腳本或函數,使用寫詳細和寫入調試,它們的產出將會自動取消。
使用 –Verbose 或 –Debug,運行該腳本或函數並寫詳細或寫入調試 (分別) 都神奇地啟動。 這是您的腳本產生 (寫詳細) 的分步進度資訊或添加調試中斷點 (寫入調試) 的好方法。
因為他們目前正在編寫,這兩個參數將接受只有單個值。 聲明為 [字串 []] 會讓他們接受整個集合的值。 您然後將枚舉此使用 Foreach 迴圈,因此您可以使用一個值一次。
另一個整潔的參數類型是 [交換器]:
Param([switch]$DoSomething)
現在,我可以不帶 –DoSomething 參數運行我的腳本或函數和變數 $DoSomething 內部將 $False。 如果我使用 –DoSomething 參數運行該腳本,$DoSomething 獲取設置為 $True。 沒有需要傳遞給參數的值。 Windows PowerShell 將它設置為 $True,如果您只需把它。 這是切換參數是如何運作的如果 –recurse 參數等。
請記住每個參數是其自己的實體,並以逗號分隔的下一個參數。 您會注意到在前面的示例:
[CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$computerName, [Parameter(Mandatory=$True)] [string]$filePath )
整個 –computerName 參數,包括其 [Parameter()] 裝飾,出現在逗號之前。 逗號表示我已解釋的第一個參數,並已經準備好移至下一步。 與 –filePath 相關的一切遵循逗號。 如果我需要第三個參數,我會把另一個逗號:
[CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$computerName, [Parameter(Mandatory=$True)] [string]$filePath, [switch]$DoSomething )
所有這一切被包含在 Param() 塊中。 請注意您不需要使用該 [Parameter()] 裝飾上的每個參數。 只有使用它對那些在你需要申報東西,如被強制性的此參數接受管道輸入,在某一個位置,等等。 在説明 about_functions_advanced_parameters 中運行 Windows PowerShell 的詳細資訊的其他屬性,您可以聲明這種方式。
編寫函數和接受只能通過參數輸入的腳本是一種最佳做法。 它使得更多獨立、 文檔變得更容易和更一致和其餘的殼作品的方式。
**Don Jones**是 Microsoft MVP 獎得主和"學習 Windows PowerShell 中每月的午餐 」 (曼甯出版物,2011年),旨在説明成為有效的 Windows PowerShell 任何管理員一本書的作者。 鐘斯還提供公共和現場 Windows PowerShell 培訓。 與他通過聯繫 ConcentratedTech.com 或 bit.ly/AskDon。