2012-12-11 4 views
2

Я использую scala.sys.process для запуска внешнего консольного приложения из моего кода Scala. Тем не менее, я попал в дорожный блок, когда консольное приложение требует ввода пользователя.Запуск внешнего консольного приложения от Scala в интерактивном режиме

В принципе, когда я запустить приложение консоли с

Seq("powershell" , "myConsoleApp.exe").run 

myConsoleApp.exe не запускается в своем собственном «окна». Я вижу, что консольное приложение запускается, когда я проверяю Диспетчер задач. Без фактического окна я не могу ничего на что-то задевать.

Я знаю, что Scala может возвращать вывод программы в строку или поток [String] - я думаю, что Scala, вероятно, также сможет подключать входной сигнал к внешнему процессу.

Но я действительно не хочу переписывать такую ​​логику в Scala, когда все они уже доступны во внешней программе.

Мне интересно, есть ли способ запустить внешнюю консольную программу в своем собственном окне? Или это недостаток с scala.sys.process.

Спасибо,

ответ

1

Адаптированные из этого Java ответа Show the CMD window with Java

import scala.sys.process._ 
Seq("cmd", "/c", "start", "PowerShell.exe", "myConsoleApp.exe") run 
+1

У меня нет никаких «ЦМД» в моей системе – idonnie

+0

@idonnie ЦМД оболочки Windows. – defoo

+0

@ david-holbrook отлично, хотя я считаю, что нашел более короткую альтернативу вашему решению: Seq («powershell», «Start-Process», «myConsoleApp.exe») – defoo

0

Это будет работать в интерактивном режиме с Scala консоли, копировать и :paste

val con = System.console 
new java.lang.Thread() { 
    val in = new java.lang.Thread() { 
    override def run() { 
     while (true) { 
     Thread.sleep(1) 
     if (con.reader.ready) 
      con.reader.read()   
     }  
    } 
    } 
    override def run() { 
    in.start() 
    while (true) { 
     Thread.sleep(1000) 
     con.printf("\nHai") 
    } 
    } 
}.start() 
+0

Я верю, что ваше решение будет работать. Хотя, я бы предпочел взаимодействовать с новой консолью и оставить «консоль scala» для журнала показа, события и т. Д. – defoo

+0

Я считаю, что вы можете получить экземпляр консоли для вновь созданного процесса с использованием Runtime. Если нет - мы застряли. – idonnie

1

После некоторых более прибегая к помощи, я обнаружил, что мой проблема в том, как я называю powershell. Вот решение, которое работает для меня:

Seq("powershell", "Start-Process", "myConsoleApp.exe") 
Смежные вопросы