Windows Powershell中的函數參數
在先前關于用戶自定義的Windows PowerShell的的文章中,我已經說過PowerShell中的最大特點之一是函數使用上的可擴展性強。在這篇文章中,我們將仔細看一下專業類型的函數:產品質量函數。
你問有什么區別?產品質量函數花力氣來測試輸入并在提供信息輸出的情況下為算是錯誤進行穩固工作。通常當在為產品運用函數時,你想知道它是否中斷-- 同時你也一定很想知道為什么。其它的語言需要你自己來設計參數和處理錯誤。我們是幸運的,Windows PowerShell有許多類似的內置函數。
PowerShell的參數
當我們談論Windows PowerShell函數的時候,我們需要考慮三件事情:輸入、輸出和錯誤。這篇文章將重點說明輸入,也被稱為參數。PowerShell有許多參數選項,并且可以通過以下三種方式之一來進行運用:
位置參數
PowerShell可以創建一個數值數組傳遞給函數的$args變量。傳遞給函數的每一個值從0開始被添加到這個數組中。例如:
function foo
{
Write-Host $args[0] $args[1]
}
foo "This is parameter 1" "This is parameter 2"
名字參數
PowerShell輸入的參數也可以命名,這就意味著它們可以通過名字傳遞,并且值被放置在相應的變量里。例如(注意當這個函數被調用的時候,參數顛倒,但是數值能正確的返回):
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參數
在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
}
以上這些信息應該能夠幫助你開始寫一些產品質量函數,但是請記住,這僅僅是冰山的一角。
【編輯推薦】





















