命令输出为字符串

命令输出为字符串

我想将命令的输出C:\Program Files (x86)\Java\jre7\bin\java.exe" -version作为字符串变量获取。

我尝试过这个方法: $out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version

但它给出了错误信息:

java.exe : java version "1.7.0_05"
At line:1 char:9
+ $out = & <<<< "C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
    + CategoryInfo          : NotSpecified: (java version "1.7.0_05":String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Java(TM) SE Runtime Environment (build 1.7.0_05-b05)


Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)

$out变量似乎为空。

我究竟做错了什么?

答案1

java -version命令将其输出写入标准错误流而不是 std 输出流(这就是您看到该错误的原因)。在 powershell 中,错误流不会沿着管道传递。一种可行的解决方法是创建一个简单的 Windows 批处理文件,将错误流重定向到输出流。例如,创建一个getJavaVersion.bat如下所示的文件:

@echo off
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1

然后,您可以按照预期直接从 powershell 调用它:

PS C:\Temp> $out = .\getJavaVersion.bat
PS C:\Temp> $out
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)


如果您不想创建额外的文件,那么您可以cmd.exe直接调用来获得相同的结果:

$out = cmd.exe /c '"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version  2>&1'


或者,您可以将 StdERR 输出直接重定向到 $out,这会将每个错误对象(本例中为 2 个)放入 $out(重铸为数组)。然后,您可以读取每个错误对象或最适合您的错误对象以供使用:

$out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1
$out.Count   // Show number of errors returned
$out[1]      // Show second error in array.

输出:

2
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) Java HotSpot(TM)
Client VM (build 23.1-b03, mixed mode, sharing)

有关的:使用 powershell 调用本机命令行应用程序并捕获 STDERR

答案2

java -version  2>&1 | foreach-object {$_.tostring()}

将 stderr 重定向到 stdout 并转换System.Management.Automation.ErrorRecordSystem.String

这与写入 stderr 的其他命令行应用程序一起工作。

相关内容