2011-01-20 25 views
5

Estoy tratando de escribir una aplicación simple que adopta un argumento de línea de comandos (que será un archivo Powershell ps1) y luego ejecutarlo. Así que he experimentado con varios enfoques diferentes y parece que me encuentro con un problema. Si intento invocar PowerShell desde Java, el proceso de Windows se inicia y es visible a través del explorador de procesos; sin embargo, PowerShell nunca regresa, se cuelga en una especie de bucle por su aspecto. El comando que estoy utilizando es:Proceso de Powershell colgado cuando se llama desde la aplicación Java

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

el comando se ejecuta a continuación usando:

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

En este momento estoy codificar duro la ubicación para el archivo de PS1 como yo estaba tratando de descartar esta posibilidad como un problema. Usando el explorador de proceso Puedo ver el proceso de PowerShell colgando y el comando que se ha pasado al que fue:

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

que cuando se copia en una ventana de cmd, funciona para iniciar el archivo tst.ps1. El archivo en sí es increíblemente simple en este ejemplo y creo que puedo descartar que sea la causa de la congelación, ya que he intentado lanzar otros archivos ps1 con el mismo comportamiento.

Para aumentar aún más la confusión, si uso el código java publicado anteriormente y paso en los comandos de powershell en lugar de un nombre de archivo, se ejecuta correctamente.

He recorrido la web y veo a muchas personas que experimentan el mismo problema pero nadie parece haber publicado su solución, espero que sea un simple descuido de mi parte y se pueda solucionar fácilmente.

Alguna pista/consejos son apreciados: D

Alan

Respuesta

7

Tienes que cerrar OutputStream con el fin de Powershell para salir.

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

proc.getOutputStream().close(); 
2

Está su escritura programa externo a las salidas estándar (err y por fuera)? En caso afirmativo, puede colgar esperando a que los consuma desde el proceso principal de Java. Usted puede obtener los InputStreams como llamando

Process.getInputStream() 

y

Process.getErrorStream() 

Hay más detalles aquí: Javadoc for Process

+0

Gracias por la respuesta, estoy usando la llamada Process.getInputStream(). El archivo ps1 que he configurado en este momento hasta que funciono esta clase java es, literalmente, llamar a un comando mkdir, solo para permitirme verificar fácilmente su ejecución, el único resultado debería ser lo estándar que PowerShell despliega si lo usas para crear una carpeta. Lo curioso es que veo la salida bien si llamo al comando powershell a mkdir desde java, pero cuando java llama al archivo ps1 en lugar de a un comando, ¿se bloquea? Cualquier otra idea sería genial, ya que espero que sea algo realmente simple que he pasado por alto. – Alan

+0

Tuve un problema al llamar scripts de PS1 a través de SSH. Regularmente se colgarían en ciertos casos. La secuencia de comandos se ejecutará hasta su finalización, pero no regresará. Resultó que algo estaba esperando por stdin (no sé por qué). Así que acabo de unir stdin a nul. – JasonMArcher

+0

Gracias por su respuesta Jason. Cuando dices que has vinculado stdin a nul, ¿fue esto obteniendo el flujo de entrada del proceso y cerrándolo?Intenté cerrar el flujo de entrada y salida del proc pero sin suerte. – Alan

Cuestiones relacionadas