【问题标题】:How to use a powershell function to return the expected value?如何使用powershell函数返回期望值?
【发布时间】:2018-09-11 10:32:25
【问题描述】:

众所周知,PowerShell 具有古怪的返回语义。

Function return value in PowerShell 表明我有两个主要想法:

  • 所有输出都被捕获并返回
  • return 关键字只是表示一个逻辑退出点

即使在外部作用域中保留变量之类的事情也会导致输出,例如[boolean]$isEnabled。另一个不错的是$someCollection.Add("toto"),它会吐出新的收集计数。甚至Append() 函数也会导致输出。

例如:

Function MyFunc {
        $res1 = new-object System.Text.StringBuilder
        $res1.Append("titi");
        $res2 = "toto"

        return $res2
}

$s = MyFunc
Write-Host $s

输出为:titi toto

预期的输出应该是toto

如何使用powershell函数返回期望值? (至少从更传统的编程角度来看)

【问题讨论】:

    标签: powershell


    【解决方案1】:

    改变

    $res1.Append("titi");
    

    $res1.Append("titi") | Out-Null
    

    因为该函数会返回在控制台中可见的所有输出。

    【讨论】:

    • 这是唯一的解决方案吗?为每个在控制台中返回值的函数执行此操作似乎非常乏味。
    • $n = $res1.Append("titi") 可以。我一直在使用 Out-Null,除了我提到的两个之外,没有任何其他解决方案。
    【解决方案2】:

    如果您通过使用“toto”来尝试了解您的功能是否成功,您可以这样做

    Function MyFunc {
        $res1 = new-object System.Text.StringBuilder
        $res1.Append("titi") | Out-Null
        return $?
    }
    

    “$?”如果上一个命令成功 (true) 或失败 (false),则返回布尔值。所以在外部它看起来像

    $s = MyFunc
    if ($s) {
        Write-Host "successful" -Foregroundcolor Green
    }
    else {
        Write-Error "unsuccessful"
    }
    

    【讨论】:

      【解决方案3】:

      在开发 PowerShell 时,团队希望使其易于使用。但是,这让那些从其他语言知道return 的人感到困惑。类中的实现是为了纠正这个错误。

      return 关键字在 PowerShell 类中的方法中的作用非常不同。它的工作方式类似于其他语言中的 return 语句。

      在类方法中,return 关键字:

      • 退出当前范围。
      • 返回关联对象(return)。
      • 仅返回关联的对象。
      • Return 返回的对象必须与方法的返回类型匹配。

      return关键字及其他语言的类似关键字一致。

      class ClassMyFunc
      {
          [string] MyFunc
          {
              $res1 = new-object System.Text.StringBuilder
              $res1.Append("titi")
              $res2 = "toto"
      
              return $res2
          }
      }
      
      $cmf = New-Object -TypeName ClassMyFunc
      $cmf.MyFunc()
      

      正如预期的那样,输出为:toto。 使用类解决了我的问题,而无需搜索所有在控制台中返回值的函数并将其传递给Out-Null(如@TobyU 所建议的那样)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多