无法使用 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
才能产生输出(并且该方法必须声明合适的 return类型)。
类似地,stderr 输出 - 这是 java -version
产生的 - 不会自动通过。
注:
- 改为使用
java --version
,即 two 领先 -
,生成 stdout,以便
return java --version
would 产生输出,尽管可能不是预期的格式 - 见下文,其中讨论了格式化方面以及必须捕获 stderr 输出的一般情况.
因此,将 return
与 2>&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)
我正在编写 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
才能产生输出(并且该方法必须声明合适的 return类型)。
类似地,stderr 输出 - 这是 java -version
产生的 - 不会自动通过。
注:
- 改为使用
java --version
,即 two 领先-
,生成 stdout,以便return java --version
would 产生输出,尽管可能不是预期的格式 - 见下文,其中讨论了格式化方面以及必须捕获 stderr 输出的一般情况.
因此,将 return
与 2>&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)