无法使用 PowerShell 脚本显示 Java 版本

Not able to display Java version using PowerShell Script

我正在编写 Powershell 脚本,它本质上是一个用于执行随机任务的菜单驱动实用程序。其中一项功能包括显示 java 版本。我正在使用 REPL 将其置于继续循环中。我的问题是 Java 版本没有显示在屏幕上。任何人都可以帮我解决这个问题或解决方法吗?下面是代码:



 enum Outcome
{
    Continue
    Quit
}
 
 Class Opatch_Manager {
     
     REPL() {

        while($this.ShowMenu() -eq 'Continue') {
            $this.Print()
        }
    }

    Print() {
        Write-Host "Test"
    }
    
   [String] ShowJava() {
     java -version
    }
   
    [Outcome] ShowMenu() {
        $this.ShowJava() 
        return [Outcome]::Quit
     }
     
 }
 
 $obj = New-Object Opatch_Manager
 $obj.REPL()
 

与在脚本和函数中直接使用命令不同,PowerShell 自定义 classes 中的方法必须使用 return 才能产生输出(并且该方法必须声明合适的 return类型)。

类似地,stderr 输出 - 这是 java -version 产生的 - 不会自动通过。

:

  • 改为使用 java --version,即 two 领先 -,生成 stdout,以便
    return java --version would 产生输出,尽管可能不是预期的格式 - 见下文,其中讨论了格式化方面以及必须捕获 stderr 输出的一般情况.

因此,将 return2>&1 重定向结合(简化示例):

class Foo {

  [String] ShowJava() {
    return (java -version 2>&1) -join "`n"
   }

}  

[Foo]::new().ShowJava() 
  • 2>&1 将 stderr (2) 输出重定向到 PowerShell 的成功输出流(类似于 stdout),以便 return 可以 return 它.

  • -join "`n" 用于 return 输出行作为单个 multi-line 字符串。

    • 这是必要的,因为您的方法被声明为 [string],而外部程序的输出由 PowerShell 逐行报告,收集时变为 array,PowerShell 将数组(通常)字符串化为 single-line 字符串,即通过连接(字符串化)具有 个空格的元素 .

      • 注:较简单的java -version 2>&1 | Out-String原则上可行,但Out-String unfortunately invariably adds a trailing newline to the resulting string - see GitHub issue #14444供讨论。
    • 另一种方法是将您的方法声明为 [string[]] - 然后
      return java -version 2>&1 就可以了(并且 array 行是 returned)