2011-01-20 29 views
5

Tôi đang cố gắng viết một ứng dụng đơn giản mà tham gia vào một cuộc tranh cãi dòng lệnh (sẽ là tệp Powershell ps1) và sau đó chạy nó. Vì vậy, tôi đã thử nghiệm với một số phương pháp khác nhau và dường như đang chạy vào một vấn đề. Nếu tôi cố gắng gọi powerhell từ bên trong java, quá trình cửa sổ được bắt đầu và có thể nhìn thấy thông qua quá trình thám hiểm, tuy nhiên powershell không bao giờ trả về, nó treo trong một số loại vòng lặp bởi vẻ ngoài của nó. Lệnh tôi đang sử dụng là:Quá trình Powershell treo khi được gọi từ ứng dụng Java

  String command = "powershell -noprofile -noninteractive \"&C:\\new\\tst.ps1\""; 

lệnh sau đó được thực hiện sử dụng:

Runtime systemRuntime = Runtime.getRuntime(); 
Process proc = systemRuntime.exec(command); 

Tại thời điểm tôi đang cứng mã hóa vị trí các tập tin ps1 như tôi đã cố gắng để cai trị này ra như một vấn đề. Sử dụng một quá trình thám hiểm Tôi có thể thấy quá trình powershell treo và lệnh được truyền cho nó là:

powershell -noprofile -noninteractive "&C:\new\tst.ps1" 

mà khi sao chép vào một cửa sổ cmd, công trình để khởi động các tập tin tst.ps1. Bản thân tập tin là vô cùng đơn giản trong ví dụ này và tôi nghĩ rằng tôi có thể loại trừ nó ra là nguyên nhân của việc đóng băng như tôi đã cố gắng để khởi động các tập tin ps1 khác cùng một hành vi có thể được nhìn thấy.

Để tiếp tục thêm vào sự nhầm lẫn, nếu tôi sử dụng mã java được đăng ở trên và chuyển các lệnh powershell thay vì tên tệp thì nó chạy thành công.

Tôi đã lướt web và thấy nhiều người gặp vấn đề tương tự nhưng không ai có vẻ đã đăng ở đó giải pháp, tôi hy vọng việc giám sát đơn giản về phía tôi và có thể dễ dàng được khắc phục.

Bất kỳ gợi ý/lời khuyên được đánh giá cao: D

Alan

Trả lời

7

Bạn phải đóng OutputStream để cho Powershell để thoát.

Runtime systemRuntime = Runtime.getRuntime(); 
Process proc = systemRuntime.exec(command); 

proc.getOutputStream().close(); 
2

là chương trình viết bên ngoài của bạn với kết quả đầu ra tiêu chuẩn (err và ra)? Nếu có, nó có thể treo chờ bạn để tiêu thụ chúng từ quá trình cha mẹ java. Bạn có thể lấy những người như InputStreams bằng cách gọi

Process.getInputStream() 

Process.getErrorStream() 

Có nhiều chi tiết ở đây: Javadoc for Process

+0

Cảm ơn câu trả lời, Im sử dụng cuộc gọi Process.getInputStream(). Tệp ps1 mà tôi đã thiết lập tại thời điểm này cho đến khi tôi nhận được lớp java này hoạt động đúng nghĩa là gọi lệnh mkdir, chỉ để cho phép tôi dễ dàng kiểm tra nó, kết quả duy nhất từ ​​nó phải là công cụ chuẩn mà PowerShell tách ra nếu bạn sử dụng nó để tạo một thư mục. Điều kỳ lạ là tôi thấy đầu ra tốt nếu tôi gọi lệnh powershell để mkdir từ java, nhưng khi java gọi tập tin ps1 thay vì một lệnh trực tiếp nó treo? Bất kỳ ý tưởng nào khác sẽ tuyệt vời, vì tôi hy vọng điều gì đó thật sự đơn giản mà tôi đã bỏ qua! – Alan

+0

Tôi gặp sự cố khi gọi tập lệnh PS1 qua SSH. Họ thường xuyên bị treo trong một số trường hợp. Tập lệnh sẽ chạy để hoàn thành, nhưng không trả lại. Nó bật ra rằng một cái gì đó đã chờ đợi stdin (Tôi không biết tại sao). Vì vậy, tôi chỉ gắn stdin để nul. – JasonMArcher

+0

Cảm ơn câu trả lời của bạn Jason. Khi bạn nói bạn gắn stdin để nul, là điều này bằng cách nhận được inputstream của proc và đóng nó?Tôi đã cố gắng đóng dòng đầu vào và đầu ra của proc nhưng không có may mắn. – Alan

Các vấn đề liên quan