10

一般コード

次のコードを検討してください。

PS> function Test { param($p='default value') $PsBoundParameters }
PS> Test 'some value'
Key                                                               Value
---                                                               -----
p                                                                 some value
PS> Test
# nothing

どちらの場合も変数の$PsBoundParametersレコードが含まれると思います。$pそれは正しい行動ですか?

質問

多くの機能で次のように機能するスプラッティングを使用したいと思います。

function SomeFuncWithManyRequiredParams {
  param(
    [Parameter(Mandatory=$true)][string]$p1,
    [Parameter(Mandatory=$true)][string]$p2,
    [Parameter(Mandatory=$true)][string]$p3,
  ...other parameters
  )
  ...
}
function SimplifiedFuncWithDefaultValues {
  param(
    [Parameter(Mandatory=$false)][string]$p1='default for p1',
    [Parameter(Mandatory=$false)][string]$p2='default for p2',
    [Parameter(Mandatory=$false)][string]$p3='default for p3',
  ...other parameters
  )
  SomeFuncWithManyRequiredParams @PsBoundParameters
}

列挙されたすべてのパラメーターで SomeFuncWithManyRequiredParams を呼び出したくありません。

  SomeFuncWithManyRequiredParams -p1 $p1 -p2 $p2 -p3 $p3 ...

出来ますか?

4

4 に答える 4

7

私はこの質問が非常に古いことを知っていますが、最近、このようなものが必要でした (多くのデフォルトパラメーターでスプラッティングを行いたいと思っていました)。私はこれを思いつきました、そしてそれは非常にうまくいきました:

$params = @{}
foreach($h in $MyInvocation.MyCommand.Parameters.GetEnumerator()) {
    try {
        $key = $h.Key
        $val = Get-Variable -Name $key -ErrorAction Stop | Select-Object -ExpandProperty Value -ErrorAction Stop
        if (([String]::IsNullOrEmpty($val) -and (!$PSBoundParameters.ContainsKey($key)))) {
            throw "A blank value that wasn't supplied by the user."
        }
        Write-Verbose "$key => '$val'"
        $params[$key] = $val
    } catch {}
}

恥知らずなプラグイン: これを、より詳しい説明とサンプルの使用スクリプトを含むブログ投稿にすることにしました。

于 2014-09-09T23:10:39.440 に答える
5

「バインド」をどのように定義するかによって異なります。つまり、ユーザーが指定した値または関数によって指定されたデフォルト値から値がバインドされていると思いますか? 正直なところ、「バインド」が前者を意味するように表示されているように動作することは驚くことではありません-ユーザー入力からのバインド。とにかく、$PSBoundParameters 変数にパッチを適用することでこれを解決できます。

function SimplifiedFuncWithDefaultValues { 
  param( 
    [Parameter(Mandatory=$false)][string]$p1='default for p1', 
    [Parameter(Mandatory=$false)][string]$p2='default for p2', 
    [Parameter(Mandatory=$false)][string]$p3='default for p3', 
  ...other parameters 
  ) 
  if (!$PSBoundParameters.ContainsKey(p1))
  {
    $PSBoundParameters.p1 = 'default for p1'
  }
  # rinse and repeat for other default parameters.
  SomeFuncWithManyRequiredParams @PSBoundParameters 
} 
于 2010-05-11T20:35:38.567 に答える