![](/img/trans.png)
[英]Which Azure AD version works (should be installed) in a Linux based Azure Deployment Script using PowerShell 6.3
[英]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 时的一般情况。 因此,结合return
与2>&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.