16

PowerShell で Java バージョンを取得しようとしています。バージョン文字列はstderrに出力されるため、それを stdout にリダイレクトして文字列変数に割り当てようとしています。

次の奇妙なエラーが表示されます。

PS P:\> & java -version 2>&1
java.exe : java version "1.7.0_25"
At line:1 char:2
+ & <<<<  java -version 2>&1
    + CategoryInfo          : NotSpecified: (java version "1.7.0_25":String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

リダイレクトなしの呼び出し (2>&1) では、次のようになります。

PS P:\> & java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

ここでのJavaは無関係だと思います.stderrに文字列を出力する他のプログラムでも同じことが起こります。

私が使用する PowerShell のバージョンは2.0です。

質問:

  • stderr を変数にリダイレクトするにはどうすればよいですか?
  • あるいは、インストールされている Java のバージョンを確認するにはどうすればよいですか?

回避策

次のように実行できます。

$output = & cmd /c "java -version 2>&1"

しかし、必要のない場所で cmd.exe を実行するのは嫌いです。

4

2 に答える 2

15

1 つの方法は、WMIを使用することです。

$javaver =  Get-WmiObject -Class Win32_Product -Filter "Name like 'Java(TM)%'" | Select -Expand Version

もう 1 つは、start-process を使用してファイルにリダイレクトする方法です。

start-process  java  -ArgumentList "-version" -NoNewWindow -RedirectStandardError .\javaver.txt

$javaver = gc .\javaver.txt

del .\javaver.txt

そして私の最後は:

dir "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1

この場合にstderrをリダイレクトする方法については、次のことができます。

$out = &"java.exe" -version 2>&1
$out[0].tostring()
于 2013-09-19T09:32:50.333 に答える