我希望我可以设置一个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个问题
答案 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。你永远不会援引一个 脚本块进行转换。“