Tại sao PsExec bị treo sau khi chạy thành công tập lệnh powershell?


12

Kịch bản khá thẳng về phía trước. Đơn giản chỉ cần cố gắng để bắt đầu một loạt các dịch vụ windows. Thực thi cục bộ hoạt động tốt khi trên máy mục tiêu. Kịch bản cũng thực sự hoạt động tốt khi được thực hiện thông qua PsExec, nó chỉ không bao giờ quay trở lại cho đến khi tôi nhấn phím "enter" trên dấu nhắc của CMD. Đây là một vấn đề, bởi vì điều này đang được gọi từ TeamCity, và nó khiến Đại lý treo chờ đợi PsExec trở lại.

Tôi đã thử như sau:

  • Thêm exitexit 0ở cuối tập lệnh Powershell
  • Thêm một < NULvào cuối cuộc gọi PsExec, theo câu trả lời trong câu hỏi SF này
  • Thêm một >chuyển hướng xuất sắc

Đây là cách tôi thực sự gọi psexec:

psexec \\target -u domain\username -p password powershell c:\path\script.ps1

Bất kể tôi làm gì, nó vẫn treo cho đến khi tôi cục bộ trên dấu nhắc cmd. Sau khi tôi nhấn enter, tôi nhận được thông báo:

powershell exited on target with error code 0.

Câu trả lời:


11

Hóa ra đây là một vấn đề phổ biến. Tìm thấy giải pháp ở đây . Về cơ bản, nếu bạn chuyển một số dữ liệu trên stdin bằng cmd, nó sẽ trả về đúng sau khi thực thi (vì nó đang được chạy qua cmd, không phải powershell).

Thí dụ:

psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"

được thiết lập là Dòng lệnh - Tập lệnh tùy chỉnh hoặc Dòng lệnh - Có thể thực thi (trong TeamCity)?
Wojtek Turowicz

OK Ive thiết lập nó là Executable và nó đã giúp. Cảm ơn bạn tôi đã dành 1 ngày để chẩn đoán nó. Thông báo!
Wojtek Turowicz

Sau một ngày, vấn đề trở lại ...
Wojtek Turowicz

11

Tôi biết câu trả lời đến muộn nó đã được tìm ra, Nếu không nó có thể hữu ích cho khách truy cập trong tương lai.

STDIN phải được định hướng lại trong lệnh thực thi quyền hạn để có thể đến từ hang (Ở đây, nó chờ trong STDIN). để có thể làm điều này sử dụng -inputformat không

powershell -inputformat none -File powershell_script.ps1 sẽ làm việc.

Kiểm tra - https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected


Điều này không chỉ hoạt động, mà còn giải thích tại sao câu trả lời được chấp nhận hoạt động. Cảm ơn!
jpaugh

5
psexec \\target -u domain\username -p password -d powershell c:\path\script.ps1

Cũng khắc phục vấn đề.

Các -dlá cờ cho psexec cũng giống như "chạy và thoát" một cách không tương tác:

-d Đừng đợi ứng dụng chấm dứt.

Chỉ sử dụng cho các ứng dụng không tương tác.


0

Powershell không thoát. Hãy thử dòng lệnh này

Powershell -command script.ps1

0

Tôi đã chạy psexecvới tập lệnh VBS và giải pháp được đánh dấu là tốt nhất (EX psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1":) chỉ hoạt động với tôi trong mỗi lần chạy thứ 3 trở đi. Tôi đã tiếp tục đào và tôi tìm thấy mô tả của từng công tắc

Tôi quyết định thử "-s" và rằng những gì làm việc cho tôi mỗi lần Đây là ví dụ của tôi:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
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.