Процесс Powershell зависает при вызове из Java-приложения - PullRequest
6 голосов
/ 20 января 2011

Я пытаюсь написать простое приложение, которое принимает аргумент командной строки (это будет файл Powershell ps1) и затем запускает его.Итак, я экспериментировал с рядом различных подходов и, похоже, столкнулся с проблемой.Если я пытаюсь вызвать powershell изнутри java, процесс windows запускается и отображается через проводник процессов, однако powershell никогда не возвращается, он выглядит как-то в виде цикла.Команда, которую я использую:

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

Затем команда выполняется с использованием:

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

В настоящий момент я жестко кодирую местоположение файла ps1, как пыталсяисключить это как проблему.С помощью проводника процессов я вижу зависший процесс powershell и команду, которая ему была передана:

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

, которая при копировании в окно cmd работает для запуска файла tst.ps1.Сам файл невероятно прост в этом примере, и я думаю, что могу исключить его как причину остановки, так как я пытался запустить другие файлы ps1, то же поведение можно увидеть.

Для дальнейшего добавления кпутаница, если я использую код Java, опубликованный выше, и передаю команды powershell вместо имени файла, то он успешно запускается.

Я просмотрел сеть и увидел, что многие люди сталкиваются с такой же проблемой, но никому не кажетсячтобы опубликовать там решение, я надеюсь, что это простое упущение с моей стороны и может быть легко исправлено.

Любые советы / подсказки приветствуются: D

Алан

Ответы [ 2 ]

9 голосов
/ 01 июля 2011

Вы должны закрыть OutputStream для выхода из Powershell.

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

proc.getOutputStream().close();
2 голосов
/ 20 января 2011

Ваша внешняя программа записывает на стандартные выходы (ошибки и нет)? Если да, он может зависнуть, ожидая, что вы будете использовать их из родительского процесса Java. Вы можете получить их как InputStreams, вызвав

Process.getInputStream()

и

Process.getErrorStream()

Здесь больше подробностей: Javadoc для процесса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...