2011-01-20 15 views
5

Sto provando a scrivere un'applicazione semplice che accetta un argomento di riga di comando (che sarà un file ps1 di Powershell) e quindi eseguirlo. Quindi ho approfondito un numero di approcci diversi e sembra che si stia imbattendo in un problema. Se provo a richiamare PowerShell da java, il processo di Windows è avviato ed è visibile tramite Process Explorer, tuttavia PowerShell non ritorna mai, si blocca in una sorta di loop dall'aspetto di esso. Il comando che sto usando è:Powershell processo sospeso quando chiamato dall'applicazione Java

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

Il comando viene quindi eseguito utilizzando:

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

Al momento mi sto difficile codifica la posizione in cui il file PS1 come stavo cercando di escludere questo caso come un problema. Utilizzando un esploratore processo riesco a vedere il processo di PowerShell appesa e il comando che è stato passato era:

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

che una volta copiato in una finestra cmd, lavora per avviare il file tst.ps1. Il file stesso è incredibilmente semplice in questo esempio e penso di poterlo escludere essendo la causa del blocco, come ho provato a lanciare altri file ps1, lo stesso comportamento può essere visto.

Per aggiungere ulteriore confusione, se utilizzo il codice java pubblicato in precedenza e passo i comandi di PowerShell anziché il nome di un file, viene eseguito correttamente.

Ho setacciato il web e vedo un sacco di persone che hanno riscontrato lo stesso problema, ma nessuno sembra aver postato lì la soluzione, spero sia una semplice supervisione da parte mia e possa essere facilmente risolta.

Eventuali suggerimenti/consigli sono apprezzati: D

Alan

risposta

7

Dovete chiudere OutputStream in ordine per PowerShell per uscire.

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

proc.getOutputStream().close(); 
2

È la tua scrittura programma esterno alle uscite standard (err e fuori)? Se sì, può bloccarsi aspettando che tu li consumi dal processo genitore Java. È possibile ottenere quelli come InputStreams chiamando

Process.getInputStream() 

e

Process.getErrorStream() 

C'è maggiori dettagli qui: Javadoc for Process

+0

Grazie per la risposta, Im utilizzando la chiamata Process.getInputStream(). Il file ps1 che ho impostato al momento fino a quando questa classe java funziona sta letteralmente chiamando un comando mkdir, solo per permettermi di controllare facilmente la sua esecuzione, l'unico output da esso dovrebbe essere la roba standard che spinge PowerShell fuori se lo usi per creare una cartella. La cosa strana è che vedo bene l'output se chiamo il comando powershell a mkdir da java, ma quando java chiama il file ps1 invece di un comando direttamente si blocca? Qualsiasi altra idea sarebbe grandiosa, come spero sia qualcosa di veramente semplice che ho trascurato! – Alan

+0

Ho riscontrato un problema con la chiamata agli script PS1 su SSH. Si bloccavano regolarmente in alcuni casi. Lo script funzionerà fino alla fine, ma non tornerà. Si è scoperto che qualcosa stava aspettando lo stdin (non so perché). Quindi ho solo legato stdin a nul. – JasonMArcher

+0

Grazie per la tua risposta, Jason. Quando dici di aver legato stdin a zero, è stato questo ottenendo l'inputstream del proc e chiudendolo?Ho provato a chiudere il flusso di input e output del proc, ma senza fortuna. – Alan

Problemi correlati