PsExec, bir powershell betiğini başarıyla çalıştırdıktan sonra neden askıda kalıyor?


12

Senaryo oldukça basittir. Sadece bir grup windows hizmetini başlatmaya çalışır. Hedef makinedeyken yürütme yerel olarak iyi çalışır. Komut dosyası aslında PsExec ile yapıldığında da iyi çalışıyor, CMD istemimde "enter" tuşuna basana kadar asla geri dönmüyor. Bu bir sorundur, çünkü bu TeamCity'den çağrılır ve Agent'ın PsExec'in geri dönmesini beklemesini sağlar.

Aşağıdakileri denedim:

  • Bir ekleme exitve exit 0Powershell komut sonunda
  • Bu SF sorusundaki< NUL cevap başına PsExec çağrısının sonuna a ekleme
  • Bir >stdout yönlendirmesi ekleme

Ben aslında psexec böyle çağırıyorum:

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

Ne yaparsam yapayım, yerel olarak cmd istemine kadar kilitleniyor. Enter tuşuna bastıktan sonra şu mesajı alıyorum:

powershell exited on target with error code 0.

Yanıtlar:


11

Bunun ortak bir sorun olduğu ortaya çıktı. Çözümü burada buldum . Temel olarak, cmd ile stdin ile ilgili bazı verileri bağlarsanız, yürütüldükten sonra düzgün bir şekilde dönecektir (çünkü powershell değil cmd ile çalıştırılmaktadır).

Misal:

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

- Özel Komut Dosyası veya Komut Satırı - Yürütülebilir (TeamCity'de) olarak ayarlandı mı?
Wojtek Turowicz

Tamam Yürütülebilir olarak ayarladım ve yardımcı oldu. Teşekkürler dostum Teşhis için 1 gün geçirdim. Kelimeyi yay!
Wojtek Turowicz

Bir gün sonra sorun geri döndü ...
Wojtek Turowicz

11

Cevabın geç geldiğini biliyorum, zaten anlaşılmış olurdu, değilse gelecekteki ziyaretçiler için yararlı olabilir.

STDIN, asmaktan gelebilmek için powershell yürütme sürecinde yeniden yönlendirilmelidir (Burada STDIN'de beklemektedir). bunu yapabilmek için -inputformat none

powershell -inputformat none -File powershell_script.ps1 çalışacak.

Kontrol edin - https://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected


Bu sadece işe yaramaz, aynı zamanda kabul edilen cevabın neden işe yaradığını da açıklar. Teşekkürler!
jpaugh

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

Ayrıca sorunu giderir.

-dPsExec için bayrak olmayan bir interaktif bir şekilde "run ve çıkış" gibidir:

-d Uygulamanın sonlanmasını beklemeyin.

Yalnızca etkileşimli olmayan uygulamalar için kullanın.


0

Powershell çıkmıyor. Bu komut satırını deneyin

Powershell -command script.ps1

0

psexecVBS komut dosyası ile çalışıyordu ve en iyi (EX:) olarak işaretlenmiş çözüm psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"sadece her 3 ya da öylesine çalıştırmak sırasında benim için çalışıyordu. Kazmaya devam ediyordum ve her anahtarın açıklamasını buldum

"-S" denemeye karar verdim ve benim için her seferinde işe yarayan şey İşte benim örneğim:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.