2017-07-13 103 views
1

我有一個腳本提示用戶輸入(網址,用戶名和密碼等)並驗證這些輸入或再次提示用戶。將可選參數傳遞給子例程而不實例化

現在我希望能夠在命令行中調用這些腳本,並將它們作爲可選參數並將它們傳遞給原始子例程。但是,在腳本範圍內,我可以測試參數是否由$PSBoundParameters.ContainsKey('a')提供,但是一旦我將參數$a(可能未提供)傳遞給某個函數,相同的測試將始終返回$True

樣品的編號:

function main { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "main - a is $a" 
    } 
    else { 
     "main - didn't get a" 
    } 
    getStr $a 
} 

function getStr { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "getStr - a is $a" 
    } 
    else { 
     "getStr - didn't get a" 
    } 
} 

輸入:

main 

main "hello" 

預期輸出:

main - didn't get a 
getStr - didn't get a 

main - a is hello 
getStr - a is hello 

實際輸出:

main - didn't get a 
getStr - a is 

main - a is hello 
getStr - a is hello 

我的猜測是,$a被實例化調用getStr $a的時候,有沒有處理這更優雅/正確的方法?

回答

2

使用@PSBoundParameters。我修改了你的函數,所以我可以把它作爲腳本運行。

代碼

param (
    [string]$a 
) 

function main { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "main - a is $a" 
    } 
    else { 
     "main - didn't get a" 
    } 
    getStr @PSBoundParameters 
} 

function getStr { 
    param (
     [string]$a 
    ) 
    if ($PSBoundParameters.ContainsKey('a')) { 
     "getStr - a is $a" 
    } 
    else { 
     "getStr - didn't get a" 
    } 
} 
main @PSBoundParameters 

輸出

PS C:\> .\code.ps1 -a string 
main - a is string 
getStr - a is string 
PS C:\> .\code.ps1 
main - didn't get a 
getStr - didn't get a 
+0

謝謝,這解決了如規定的問題。如果我可以 - 那麼我可能會得到幾個參數,哪個子程序只需要檢查一個呢? –

+1

爲了將來的參考 - 我自己測試過,我只是將splatted('@')'PSBoundVariables'發送給每個函數,它會檢查它想要的密鑰。 –

相關問題