繁体   English   中英

无法使用 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 自定义class es 中的方法必须使用return才能产生 output(并且该方法必须声明合适的返回类型)。

同样, stderr output - 这是java -version产生的 - 不会自动通过。

注意

  • 使用java --version代替,即两个前导- ,代替生成标准输出,以便
    return java --version产生 output,尽管可能不是预期的格式 - 请参见下文,其中讨论了格式化方面以及必须捕获 stderr output 时的一般情况。

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

class Foo {

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

}  

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

  • -join "`n"用于将 output 行作为单个多行字符串返回。

    • 这是必要的,因为您的方法被声明为[string] ,而来自外部程序的 output 由 PowerShell逐行报告,收集时成为一个数组,并且 PowerShell 将 arrays (通常)字符串化为单行字符串,即通过将(字符串化的)元素与空格连接起来。

      • 注意:更简单的java -version 2>&1 | Out-String java -version 2>&1 | Out-String原则上是有效的,但不幸的是, Out-String总是在结果字符串中添加尾随换行符- 请参阅GitHub 问题 #14444进行讨论。
    • 另一种方法是将您的方法声明为[string[]] - 然后
      return java -version 2>&1会做(并返回一行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM