2012-09-27 154 views
2

我曾希望能夠設置cmdlet,以便在參數值存在或以其他方式提示時使用環境變量。使用ScriptBlock作爲強制性測定

function Test-Mandatory 
{ 
    [CmdletBinding()] 
    param(
    [Parameter(Mandatory = { [string]::IsNullOrEmpty($Env:TEST_PARAM) })] 
    [string] 
    $foo = $Env:TEST_PARAM 
) 

    Write-Host $foo 
} 

遺憾的是,似乎不管我是否有$Env:TEST_PARAM集,cmdlet將始終提示$ foo的。

我可以重新驗證使用[ValidateScript({ #snip #}),但後來我不會再獲得Powershell提示所需的值,如果$Env:TEST_PARAM不存在。我只會得到一個驗證錯誤。

所以這裏2

  • 問題爲什麼會甚至可以指定一個腳本塊,以強制性的,如果它不會出現兌現?
  • 根據我指定的標準,是否有一種簡單的方法可以獲得默認的PS提示行爲?

回答

0

僅供參考,這裏是微軟不得不說一下吧:

「這不是一個真正的錯誤。腳本塊是有效的屬性參數 - 例如,ValidateScriptBlock在其他情況下效果不佳
屬性參數總是轉換爲參數類型 強制性的情況 - 它需要一個bool和一個當你將 ScriptBlock轉換爲bool時,你會得到值$ true。你永遠不調用 腳本塊做了轉換。」

+0

A-ha ..優秀的答案。正是我在找什麼。有趣的注意到:轉換。 –

0

對於第二個問題,您可以隨時驗證腳本中的值。只需將該值設置爲環境變量作爲默認值即可。當我使用($foo -eq $null)進行驗證時,它不起作用,所以我將它切換爲($foo -eq "")。下面是我測試讓你問什麼樣本:

function Test-Mandatory 
{ 
    [CmdletBinding()] 
    param(
    [string] $foo = $Env:TEST_PARAM 
) 
begin { 
    if ($foo -eq "") { 
     $foo = Read-Host "Please enter foo: " 
    } 
} #end begin 
process { 
    Write-Host $foo 
} #end process 
} #end function 

至於強制性的問題,我相信,如果你指定一個默認值(即使是空的),它會滿足強制分配。當它檢查值是否存在時,由於它被分配了一個值,強制檢查是真實的,允許它繼續。

+0

你是正確的默認值阻止'Mandatory'腳本塊的運行。我給你‘正確’了點。 –

+0

讀 - 主機是不是我一直在尋找雖然.. –

0

值得注意的是,這並不像你期望的那樣工作......只要$ Env:TEST_PARAM不存在,我希望$ foo被標記爲強制

然而,即使$ ENV:TEST_PARAM存在,程序會提示:(

function Test-Mandatory 
{ 
    [CmdletBinding()] 
    param(
    [Parameter(Mandatory = { [string]::IsNullOrEmpty($Env:TEST_PARAM) })] 
    [string] 
    $foo 
) 

if (!$PsBoundParameters.foo) { $foo = $Env:TEST_PARAM } 

    Write-Host $foo 
}