2012-12-03 59 views
12

有沒有辦法在PowerShell函數中創建一個必須調用它才能考慮它的參數?使用可選的調用變量創建一個函數

通過命令行給出一個例子(大膽的是什麼,我想這樣做):

Invoke-Command-computernameServer01-Scriptblock{...}

這裏是什麼,我想用的功能做榜樣

Function DoStuff($computername, -arg2, -domain $domain) 
    Test-parameter(-domain) if (-domain -eq $true) { 
     use $domain 
    } 
    Else { 
     $domain = "Domain1" 
    } 
    test-parameter($arg2) { 
     if ($arg2 -eq $true) { 
      Do something 
     } 
     else { 
      Do the opposite 
     } 
    } 

綜上所述:

如果「-arg2」存在,我希望在腳本中發生一些事情。如果「-Domain」存在並且有它的一個參數,我希望使用它而不是set參數。

回答

23

Powershell爲通用參數場景提供了許多內置支持,包括必需參數,可選參數,「switch」(又名標誌)參數和「參數集」。

默認情況下,所有參數都是可選的。最基本的方法是簡單地檢查$null的每一個,然後從那裏實現你想要的任何邏輯。這基本上就是您在示例代碼中已經顯示的內容。

如果您想了解所有的特殊支持PowerShell將可以給你的,請查看以下鏈接:

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

+0

完美由於一噸! – user100541

+2

請注意,'[string]'參數初始化爲空字符串,不是'$ null'。他們必須用'-eq'''進行測試 – helb

5

不知道我是否理解正確的問題。

從我收集的內容來看,你希望能夠爲Domain分配一個值,如果它爲空,並且還要檢查是否提供了$ args2並根據該值執行某個代碼?

我改變了代碼以重新組裝上面所做的假設。

Function DoStuff($computername, $arg2, $domain) 
{ 
    if($domain -ne $null) 
    { 
     $domain = "Domain1" 
    } 

    if($arg2 -eq $null) 
    { 
    } 
    else 
    { 
    } 
} 

DoStuff -computername "Test" -arg2 "" -domain "Domain2" 
DoStuff -computername "Test" -arg2 "Test" -domain "" 
DoStuff -computername "Test" -domain "Domain2" 
DoStuff -computername "Test" -arg2 "Domain2" 

這有幫助嗎?

11

我不認爲你的問題是非常明確的,這段代碼假設如果你要包含-domain參數,它總是'named'(即dostuff computername arg2 -domain domain);這也使得computername參數成爲強制性的。

Function DoStuff(){ 
    param(
     [Parameter(Mandatory=$true)][string]$computername, 
     [Parameter(Mandatory=$false)][string]$arg2, 
     [Parameter(Mandatory=$false)][string]$domain 
    ) 
    if(!($domain)){ 
     $domain = 'domain1' 
    } 
    write-host $domain 
    if($arg2){ 
     write-host "arg2 present... executing script block" 
    } 
    else{ 
     write-host "arg2 missing... exiting or whatever" 
    } 
} 
相關問題