使用ScriptBlock作为强制的确定

时间:2012-09-27 14:31:38

标签: validation function powershell

我希望我可以设置一个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提示所需的值。我只是得到验证错误。

这里有2个问题

  • 为什么我甚至可以将一个脚本块分配给Mandatory,如果它似乎没有被尊重?
  • 根据我指定的条件,是否有一种简单的方法可以获得默认的PS提示行为?

3 个答案:

答案 0 :(得分: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

至于强制性问题,我相信如果你指定一个默认值(即使它是空的),它将满足强制性赋值。当它检查值是否存在时,由于它被赋值,强制检查为true,允许它继续。

答案 1 :(得分:0)

值得注意的是,这并不像你期望的那样有效......我希望只有当$ 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
}

答案 2 :(得分:0)

仅供参考,这就是微软对此所说的话:

  

“这不是一个真正的错误。脚本块是有效的属性参数 -   例如否则,ValidateScriptBlock将无法正常工作   属性参数始终转换为参数类型。在   强制性的情况 - 它需要一个bool,并且任何时候你转换一个   ScriptBlock bool,你会得到值$ true。你永远不会援引一个   脚本块进行转换。“