繁体   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