Các java -version
lệnh viết đó là đầu ra cho dòng sai số chuẩn thay vì luồng đầu ra std (đó là lý do tại sao bạn thấy lỗi đó). Trong powershell, luồng lỗi không được truyền dọc theo đường ống. Một cách giải quyết khác là làm việc để tạo một tệp bó windows đơn giản để chuyển hướng luồng lỗi sang luồng đầu ra. Ví dụ: tạo một tệp caled getJavaVersion.bat
trông như thế này:
@echo off
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1
Sau đó, bạn có thể gọi nó trực tiếp từ powershell như bạn mong đợi:
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)
Nếu bạn không muốn tạo thêm tệp đó, thì bạn có thể gọi cmd.exe
trực tiếp để nhận kết quả tương tự:
$out = cmd.exe /c '"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1'
Hoặc bạn có thể chuyển hướng đầu ra StdERR trực tiếp thành $ out, điều này sẽ đặt từng đối tượng lỗi (2 trong trường hợp này) thành $ out (đúc lại dưới dạng một mảng). Sau đó, bạn có thể đọc từng hoặc một cuốn tốt nhất cho bạn, quay lại sử dụng:
$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.
Đầu ra:
2
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) Java HotSpot(TM)
Client VM (build 23.1-b03, mixed mode, sharing)
Liên quan: Sử dụng powershell gọi ứng dụng dòng lệnh gốc và bắt STDERR