
我想從命令中獲取輸出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 的其他命令列應用程式。