Perché PsExec si blocca dopo aver eseguito correttamente uno script PowerShell?


12

La sceneggiatura è abbastanza semplice. Cerca semplicemente di avviare un sacco di servizi Windows. L'esecuzione a livello locale funziona correttamente quando sul computer di destinazione. Lo script in realtà funziona bene anche quando fatto tramite PsExec, non ritorna mai fino a quando non premo il tasto "invio" sul mio prompt di CMD. Questo è un problema, perché viene chiamato da TeamCity e fa sospendere l'agente in attesa del ritorno di PsExec.

Ho provato quanto segue:

  • Aggiunta di un exite exit 0alla fine dello script Powershell
  • Aggiungendo < NULa alla fine della chiamata PsExec, per la risposta in questa domanda SF
  • Aggiunta di un >reindirizzamento stdout

Ecco come sto effettivamente chiamando psexec:

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

Non importa quello che faccio, si blocca fino a quando il localmente sul prompt cmd. Dopo aver premuto Invio, ricevo il messaggio:

powershell exited on target with error code 0.

Risposte:


11

Si scopre che questo è un problema comune. Ho trovato la soluzione qui . In sostanza, se installi alcuni dati su stdin con cmd, tornerà correttamente dopo l'esecuzione (perché viene eseguito tramite cmd, non powershell).

Esempio:

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

è impostato come riga di comando - Script personalizzato o riga di comando - eseguibile (in TeamCity)?
Wojtek Turowicz,

OK, l'ho impostato come eseguibile e mi ha aiutato. Grazie amico, ho passato 1 giorno a diagnosticare. Diffondere la parola!
Wojtek Turowicz,

Dopo un giorno il problema è tornato ...
Wojtek Turowicz l'

11

So che la risposta arriva in ritardo e sarebbe già stata individuata, altrimenti potrebbe essere utile per i futuri visitatori.

STDIN deve essere reindirizzato nell'esecuzione di PowerShell in ordine per poter venire dal blocco (Qui attende in STDIN). per poter fare questo usa -inputformat none

powershell -inputformat none -File powershell_script.ps1 funzionerà.

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


Non solo funziona, ma spiega anche perché la risposta accettata funziona. Grazie!
jpaugh

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

Risolve anche il problema.

La -dbandiera per psexec è come "corri ed esci" in modo non interattivo:

-d Non attendere la chiusura dell'applicazione.

Utilizzare solo per applicazioni non interattive.


0

Powershell non sta uscendo. Prova questa riga di comando

Powershell -command script.ps1

0

Stavo correndo psexeccon lo script VBS e la soluzione contrassegnata come la migliore (EX:) psexec \\target -u domain\username -p password cmd /c "echo . | powershell c:\path\script.ps1"funzionava per me solo durante ogni terza esecuzione circa. Continuavo a scavare e ho trovato la descrizione di ogni interruttore

Ho deciso di provare "-s" e che cosa ha funzionato per me ogni volta Ecco il mio esempio:

call C:\psexec.exe %SERVER_NAME% -u %USERNAME% -p %PASSWORD% -h -s cscript %pathTomyVBSscript%
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.