From: http://os.51cto.com/art/201011/232924.htm 數組
在先前關於用戶自定義的Windows PowerShell的的文章中,我已經說過PowerShell中的最大特色之一是函數使用上的可擴展性強。在這篇文章中,咱們將仔細看一下專業類型的函數:產品質量函數。ide
你問有什麼區別?產品質量函數花力氣來測試輸入並在提供信息輸出的狀況下爲算是錯誤進行穩固工做。一般當在爲產品運用函數時,你想知道它是否中斷-- 同時你也必定很想知道爲何。其它的語言須要你本身來設計參數和處理錯誤。咱們是幸運的,Windows PowerShell有許多相似的內置函數。函數
PowerShell的參數測試
當咱們談論Windows PowerShell函數的時候,咱們須要考慮三件事情:輸入、輸出和錯誤。這篇文章將重點說明輸入,也被稱爲參數。PowerShell有許多參數選項,而且能夠經過如下三種方式之一來進行運用:設計
位置參數htm
PowerShell能夠建立一個數值數組傳遞給函數的$args變量。傳遞給函數的每個值從0開始被添加到這個數組中。例如:對象
function foo { Write-Host $args[0] $args[1] } foo "This is parameter 1" "This is parameter 2"
名字參數ip
PowerShell輸入的參數也能夠命名,這就意味着它們能夠經過名字傳遞,而且值被放置在相應的變量裏。例如(注意當這個函數被調用的時候,參數顛倒,可是數值能正確的返回):ci
Example (notice the parameters are reversed when the function is called, but the values are returned correctly): function foo { Param($param1,$param2) Write-Host $param1 $param2 } foo -param2 "This is parameter 2" -param1 "This is parameter 1"
Splatting參數get
在PowerShell的參數傳遞中,這個或許是最經常使用的方法。它包含建立一個數組或哈希表做爲傳遞給函數的參數組。這個讓你能夠動態地建立整個腳本的參數,而後當你準備好後便可調用函數。例如:
function foo { Param($param1,$param2) Write-Host $param1 $param2 } Create Hash table $blah = @{"Param1"="This is parameter 1"; "Param2"="This is parameter 2"} # Pass hash table to function foo @Blah
PowerShell 參數的屬性
Mandatory – 這個屬性在PowerShell參數選項裏是默認的,可是若是你知道你所須要的參數類型,你能夠使用這個屬性來強制用戶傳遞這種類型的參數。若是它們沒有這樣作,PowerShell將報錯給它們,而且強迫的它們提供這種類型的值,以便函數可以正常的運行。例如:
function foo { Param( [Parameter(Mandatory=$True)] $param1 ) Write-Host $param1 }
ParameterSetName --咱們經常須要一塊兒傳遞一組參數(一般由於一些意外所中斷)。例如,你有一個函數要得到一個活動目錄對象,若是它是一個用戶或是一個計算機,你就須要知道賬戶:
function Get-ADObject { Param( [Parameter(Mandatory=$True, ParameterSetName="User")] $User, [Parameter(Mandatory=$True, ParameterSetName="Computer")] $Computer ) $PScmdlet.ParameterSetName } Get-ADObject --# This will throw an error because no parameters passed Get-ADObject –user "joe" # Will return 'User' Get-ADObject –Computer "joe" # Will return 'Computer' Get-ADObject –User "joe" –Computer "joe" # Will return an error
ValueFromPipeline -- 這個屬性告訴函數某個特定的參數值能夠經過管道來傳遞參數。例如:
function Get-ADUserObject { Param( [Parameter(ValueFromPipeline=$true)] $User, ) Process { $User } } } $ListofUsers | Get-ADUserObject
ValueFromPipelineByPropertyName -- 這個屬性彷佛與ValueFromPipeline有點類似,可是並非使用「類型」,它使用的是傳入對象的屬性名稱。例如,若是你有一個叫作UserName的用戶對象的屬性。
function Get-ADUserObject { Param( [Parameter(ValueFromPipeline ByPropertyName=$true)] $Username, ) Process { $UserName } } $ListofUserObjects | Get-ADUserObject
HelpMessage -- 這容許你給用戶添加一個幫助信息。若是他們沒有指定mandatory屬性來調用你的函數,這能夠給他們解釋須要輸入用戶名:
function Get-ADComputerObject { Param( [Parameter(Mandatory=$True,HelpMessage= "Enter computer name.")] $ComputerName, ) $ComputerName }
以上這些信息應該可以幫助你開始寫一些產品質量函數,可是請記住,這僅僅是冰山的一角。
--指定參數位置。
Param( [Parameter(Position=0,Mandatory=$true,HelpMessage='Specify the Serverlist path')] [string]$ServersListPath)