命令輸出為字串

命令輸出為字串

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

相關內容