문자열로 명령 출력

문자열로 명령 출력

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명령은 표준 출력 스트림 대신 표준 오류 스트림에 출력을 씁니다(이것이 해당 오류가 표시되는 이유입니다). Powershell에서는 오류 스트림이 파이프라인을 따라 전달되지 않습니다. 작동하는 해결 방법은 오류 스트림을 출력 스트림으로 리디렉션하는 간단한 Windows 배치 파일을 만드는 것입니다. 예를 들어 getJavaVersion.bat다음과 같은 caled 파일을 만듭니다 .

@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.ErrorRecord하고 System.String.

이는 stderr에 쓰는 다른 명령줄 응용 프로그램과 함께 작동합니다.

관련 정보