我想将命令的输出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)
答案2
java -version 2>&1 | foreach-object {$_.tostring()}
将 stderr 重定向到 stdout 并转换System.Management.Automation.ErrorRecord
为System.String
。
这与写入 stderr 的其他命令行应用程序一起工作。