【问题标题】:How do you use the default values on a PSCustomObject's ScriptMethod如何在 PSCustomObject 的 ScriptMethod 上使用默认值
【发布时间】:2021-02-24 19:34:35
【问题描述】:

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

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

$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','|')

【问题讨论】:

    标签: powershell powershell-5.0 pscustomobject


    【解决方案1】:

    为了检查参数是否绑定到参数,您需要使用$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$
    

    【讨论】:

    • 我担心我可能不清楚手头的问题,例如$o.WrapText('abc',,'$'),我通过添加$DefaultValues 哈希表来填补方法中的“漏洞”如果它是一个函数 PowerShell 会忽略的调用
    • 作为函数Wrap-Text -S 'abc' -Close '$' 将给出"abc$,这里我可以省略-Open 并使用" 的默认值,但是当它是一个ScriptMethod 时我不是确定如何在调用过程中省略参数
    • @Gregory PowerShell 在调用方法时没有任何用于按名称绑定参数的本机语法。你能提供更多关于你想用这个做什么的细节吗,也许我可以建议一个更好的方法
    猜你喜欢
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多