如何在 PSCustomObject 的 ScriptMethod 中使用默认值

问题描述

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

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

CREATE TABLE MyTable
    ([MyTimeField] nvarchar(5))
;
    
INSERT INTO MyTable
    ([MyTimeField])
VALUES
    ('00:15'),('00:30'),('01:45'),('23:15'),('23:59'),('24:00')
;

WITH IntMinutes AS
(
  SELECT
    CASE
      WHEN RIGHT('0000' + MyTimeField,5) < '24:00' THEN DATEDIFF(MINUTE,'00:00:00',MyTimeField)
      ELSE
        DATEDIFF(MINUTE,'00:' + RIGHT(MyTimeField,2)) +
        DATEDIFF(MINUTE,CAST((LEFT(MyTimeField,2) - 24) AS VARCHAR(2)) + ':00') +
        DATEDIFF(MINUTE,'23:59') + 1
    END AS Minutes
   FROM MyTable
 )
 
 SELECT SUM(Minutes) AS TotalMinutes
 FROM IntMinutes

解决方法

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