【问题标题】:How to omit $null arguments calling a function?如何省略调用函数的 $null 参数?
【发布时间】:2009-04-07 23:46:13
【问题描述】:

考虑这样的功能:

$missed = "{716C1AD7-0DA6-45e6-854E-4B466508EB96}"

function Test($foo = $missed, $bar = $missed)
{
  if(!$foo)
  {
    throw "error"
  }

  if(!$bar)
  {
    throw "error"
  }
}

我想这样调用这个函数

Test -foo $foo -bar $bar

但如果 $foo 或 $bar 为 $null,则会抛出异常。天真的解决方案是

if($foo -and $bar)
{
  Test -foo $foo -bar $bar
}
elseif ($foo)
{
  Test -foo $foo
}
elseif ($bar)
{
  Test -bar $bar
}
else
{
  Test
}

如何用一/两行重写这个 if/else 块?

【问题讨论】:

    标签: function powershell arguments


    【解决方案1】:

    既然您无法控制测试功能,那么您可以这样做:

    $params = @()
    if ($foo) {
        $params += "-Foo","`$foo"
    }
    if ($bar) {
        $params += "-Bar","`$bar"
    }
    Invoke-Expression "Test $params"
    

    【讨论】:

      【解决方案2】:
      function m ($x) {if ($x) {$x} else {$missed}}
      
      Test -foo (m $foo) -bar (m $bar)
      

      【讨论】:

        【解决方案3】:

        你可以把函数写成 -

        如果 (!$foo) {$foo = $missed}
        if (!$bar) {$bar = $missed}

        【讨论】:

        • 实际上我无法访问 Test 函数实现和 $missed 变量。这只是一个插图。我只知道当任一参数为 $null 时此函数会引发错误
        • 那么,如果你知道函数将缺失值设置为什么($missing),你可以在调用它之前设置它们吗,这意味着上面写的2个ifs在函数调用之前。
        【解决方案4】:

        您可以按如下方式使用“喷溅”:

        $params = @{}
        if ($foo) {$params['foo'] = $foo}
        if ($bar) {$params['bar'] = $bar}
        Test @params
        

        它并不短,但它通常是一个有用的技巧。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-11
          • 2014-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多