Откройте видимое окно Cmd в Java

В настоящее время у меня есть код, который выполняет задачу:

this.cmds = new String[] { "cmd.exe", "/c", customCmd };
ProcessBuilder pb = new ProcessBuilder(cmds);

try {
    pb.start();
} catch (IOException e) {
    e.printStackTrace();
}

Это работает отлично и делает то, что я ожидал.

Однако я хотел бы отображать видимое окно cmd при выполнении этой конкретной задачи.

Это возможно?

Спасибо за ваше время,

Бенна

Этот вопрос похож на: BAT-файл: откройте новое окно cmd и выполните там команду. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

aled 02.07.2024 21:57

Этот пост касается открытия командной строки Windows с помощью BAT-файла. Это не Java-программа. Когда я использую ту же логику, что и в этом сообщении, используя /k вместо /c, ничего не меняется, и окно строки cmd все еще выполняется в фоновом режиме.

Benna 02.07.2024 22:03

Кажется, этот вопрос противоположен этому. У вас возникла проблема с тем, чтобы окно консоли было видимым, в то время как у автора другого вопроса возникла проблема с тем, чтобы окно консоли НЕ было видимым. Возможно, вам стоит поменяться местами работы!

k314159 02.07.2024 22:43

@Бенна, решение применимо и к этому (с использованием аргумента /k).

aled 02.07.2024 22:56

@aled ОП сказал: «... /k вместо /c ничего не меняется...», поэтому они ответили на ваш комментарий, и это не дубликат.

k314159 02.07.2024 22:57

Этот вопрос похож на: Запустите CMD с помощью ProcessBuilder . В частности, используйте Runtime.exec() вместо ProcessBuilder, как указано в принятом ответе. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

k314159 02.07.2024 23:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте эту строку:

this.cmds = new String[] { "cmd.exe", "/c", "start cmd.exe /k " + customCmd };

Первый "cmd.exe", "/c" запускает невидимое окно, но затем внутри вы используете команду start cmd.exe /k ... для создания видимого окна, и оно останется открытым из-за /k.

Еще лучше было бы "start %ComSpec% /D /K " или "start %SystemRoot%\\System32\\cmd.exe /D /K " вместо "start cmd.exe /k ", поскольку в этом случае первому запускаемому cmd.exe не нужно искать второй для запуска cmd.exe файл в файловой системе, а второй запущенный cmd.exe не читает значение реестра AutoRun. "/D" в качестве дополнительного аргумента (опции) для первого запуска cmd.exe до "/c" также было бы полезно для предотвращения чтения значения реестра AutoRun и его выполнения, если оно действительно существует.

Mofi 03.07.2024 11:03
"cmd.exe" также следует заменить на System.getenv("ComSpec") для вызова функции библиотеки ядра Windows CreateProcess с запуском исполняемого файла с его полным именем файла.
Mofi 03.07.2024 12:35

Спасибо, это сработало отлично и решило все мои проблемы :)

Benna 03.07.2024 16:06

Другие вопросы по теме