命令输出为字符串

rik*_*rik 6 powershell

我想从命令中获取输出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)
Run Code Online (Sandbox Code Playgroud)

$out 变量似乎是空的。

我究竟做错了什么?

zda*_*dan 8

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

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

然后,您可以按预期直接从 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)
Run Code Online (Sandbox Code Playgroud)


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

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


或者您可以将 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.
Run Code Online (Sandbox Code Playgroud)

输出:

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

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