[英]Use ScriptBlock as determination for Mandatory
我希望我可以設置一個cmdlet,以便它可以使用環境變量作為參數值(如果存在),或以其他方式提示。
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 #})
,但是如果$Env:TEST_PARAM
不存在,我就不會再獲得Powershell提示所需的值。 我只是得到一個驗證錯誤。
所以這里有兩個問題
對於第二個問題,您始終可以驗證腳本中的值。 只需將值設置為環境變量作為默認值。 當我嘗試使用($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
至於強制性問題,我相信如果你指定一個默認值(即使它是空的),它將滿足強制性賦值。 當它檢查值是否存在時,由於它被賦值,強制檢查為true,允許它繼續。
值得注意的是,這並不像你期望的那樣工作......我希望只有當$ Env:TEST_PARAM不存在時才會將$ foo標記為強制。
但是,即使$ Env:TEST_PARAM存在,shell也會提示:(
function Test-Mandatory
{
[CmdletBinding()]
param(
[Parameter(Mandatory = { [string]::IsNullOrEmpty($Env:TEST_PARAM) })]
[string]
$foo
)
if (!$PsBoundParameters.foo) { $foo = $Env:TEST_PARAM }
Write-Host $foo
}
僅供參考,這就是微軟對此所說的話:
“這不是一個真正的錯誤。腳本塊是有效的屬性參數 - 例如,ValidateScriptBlock不會很好地工作。
屬性參數始終轉換為參數類型。 在Mandatory的情況下 - 它需要一個bool,並且每當你將ScriptBlock轉換為bool時,你將獲得值$ true。 你永遠不會調用腳本塊來進行轉換。“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.