Lệnh đầu ra dưới dạng chuỗi


6

Tôi muốn nhận đầu ra từ lệnh C:\Program Files (x86)\Java\jre7\bin\java.exe" -versiondưới dạng biến chuỗi.

Tôi đã thử cách này: $out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version

nhưng nó đưa ra thông báo lỗi:

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 biến có vẻ trống rỗng.

Tôi đang làm gì sai?

Câu trả lời:


8

Các java -versionlệ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.battrô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.exetrự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


Thật khó chịu: Tôi ước các ứng dụng sẽ chỉ viết LRI cho STDERR.
Jay Bazuzi

2
java -version  2>&1 | foreach-object {$_.tostring()}

chuyển hướng stderr đến stdout và chuyển đổi System.Management.Automation.ErrorRecordthành System.String.

Điều này hoạt động với các ứng dụng dòng lệnh khác ghi vào stderr.


Điều này làm việc cho tôi! Tôi đã sử dụng nó để lấy phiên bản Python từ tập lệnh PowerShell:$pythonVersion = python --version 2>&1 | % {$_.ToString()}
G. Lombard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.