4

コマンドレットをセットアップして、パラメータ値が存在する場合は環境変数を使用するか、そうでない場合はプロンプトを表示できるようにしたいと考えていました。

function Test-Mandatory
{
  [CmdletBinding()]
  param(
    [Parameter(Mandatory = { [string]::IsNullOrEmpty($Env:TEST_PARAM) })]
    [string]
    $foo = $Env:TEST_PARAM
  )

  Write-Host $foo
}

残念ながら、セットがあるかどうかに関係なく$Env:TEST_PARAM、コマンドレットは常に $foo を要求するようです。

を使用するように検証を[ValidateScript({ #snip #})やり直すことはできますが、必要な値を求める Powershell のプロンプトが表示されなくなり、$Env:TEST_PARAM存在しないはずです。単純に検証エラーが発生します。

ここで2つの質問

  • スクリプトブロックが尊重されていないように見えるのに、なぜスクリプトブロックを必須に割り当てることができるのでしょうか?
  • 指定した基準を考慮して、デフォルトの PS プロンプト動作を取得する簡単な方法はありますか?
4

3 に答える 3

1

参考までに、マイクロソフトがそれについて言わなければならなかったことは次のとおりです。

「これは実際にはバグではありません。スクリプト ブロックは有効な属性引数です。たとえば、ValidateScriptBlock はそうでなければうまく機能しません。
属性引数は常にパラメーター タイプに変換されます。Mandatory の場合、ブール値が必要で、変換するたびにScriptBlock を bool にすると、値 $true が得られます。変換を行うためにスクリプト ブロックを呼び出すことはありません。"

于 2012-10-12T14:41:44.493 に答える
0

2 番目の質問については、スクリプト内でいつでも値を検証できます。デフォルト値として環境変数に値を設定するだけです。で検証を試みた($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

注意すべき点として、これは期待どおりに機能しません... $Env:TEST_PARAM が存在しない場合にのみ、 $foo が必須としてマークされることを期待します。

ただし、$Env:TEST_PARAM が存在する場合でも、シェルは :(

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 に答える