4

我希望我可以设置一个 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 #}),但是我不会再让 Powershell 提示输入所需的值,不应该$Env:TEST_PARAM存在。我只会得到一个验证错误。

所以这里有2个问题

  • 为什么我什至可以将脚本块分配给 Mandatory 如果它似乎没有被尊重?
  • 给定我指定的标准,是否有一种简单的方法来获取默认的 PS 提示行为?
4

3 回答 3

1

仅供参考,这是微软不得不说的:

“这不是一个真正的错误。脚本块是有效的属性参数 - 例如 ValidateScriptBlock 否则不会很好地工作。
属性参数总是转换为参数类型。在强制的情况下 - 它需要一个布尔值,并且任何时候转换一个 ScriptBlock 来布尔,你会得到价值 $true。你永远不会调用一个脚本块来做一个转换。

于 2012-10-12T14:41:44.493 回答
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

至于必选题,我相信如果你分配一个默认值(即使它是空的),它会满足必选分配。当它去检查值是否存在时,因为它被分配了一个值,强制检查为真,允许它继续前进。

于 2012-09-27T14:50:18.377 回答
0

值得注意的是,这并不像您期望的那样工作......我希望 $foo仅在 $Env:TEST_PARAM 不存在时才被标记为强制。

但是,即使 $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
}
于 2012-10-07T23:42:07.330 回答