首页 > 解决方案 > 如何在 PSCustomObject 的 ScriptMethod 上使用默认值

问题描述

我试图指定方法的第三个参数的值,同时仍然让方法中的第二个参数默认。

我能够将其拼凑起来以使其正常工作,但我希望其他人有更好的解决方案

$o=[PSCustomObject]@{};
Add-Member -MemberType ScriptMethod -InputObject $o -Name 'WrapText' -Value {
   param($S,$Open='"',$Close)
   if($Close){
      "$Open$S$Close"
   }else{
      "$Open$S$Open"
   }
}

$DefaultValues = @{};
$o.WrapText.Script.Ast.ParamBlock.Parameters | %{
   $DefaultValues.($_.Name.ToString()) = $_.DefaultValue.Value
}

$o.WrapText('Some Text',$DefaultValues.'$Open','|')

标签: powershellpowershell-5.0pscustomobject

解决方案


为了检查参数是否绑定到参数,您需要使用$PSBoundParameters

Add-Member -MemberType ScriptMethod -InputObject $o -Name 'WrapText' -Value {
   param($S,$Open='"',$Close='"')
   if($PSBoundParameters.ContainsKey('Close')){
      "$Open$S$Close"
   }else{
      "$Open$S$Open"
   }
}

现在if条件是仅$true当提供第三个参数时:

PS ~> $o.WrapText('abc')
"abc"
PS ~> $o.WrapText('abc',"'")
'abc'
PS ~> $o.WrapText('abc',"'",'$')
'abc$

推荐阅读