簡體   English   中英

使用ScriptBlock作為強制的確定

[英]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提示所需的值。 我只是得到一個驗證錯誤。

所以這里有兩個問題

  • 為什么我甚至可以將一個腳本塊分配給Mandatory,如果它似乎沒有被尊重?
  • 根據我指定的標准,是否有一種簡單的方法來獲取默認的PS提示行為?

對於第二個問題,您始終可以驗證腳本中的值。 只需將值設置為環境變量作為默認值。 當我嘗試使用($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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM