我想从命令中获取输出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 变量似乎是空的。
我究竟做错了什么?
该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
| 归档时间: |
|
| 查看次数: |
14194 次 |
| 最近记录: |