Есть ли в Windows CMD эквивалент exec оболочки Unix?


9

Есть ли в Windows эквивалент "exec" в Unix Shell? По сути, мне нужно избегать разветвления нового процесса, чтобы сохранить каналы ввода / вывода, а также идентификатор процесса.

Редактировать:

Итак, вот моя проблема. У меня есть процесс A, который запускает сценарий, и этот сценарий заканчивается выполнением процесса B. Мне нужно, чтобы A получил все выходные данные B, а также смог убить B, убив процесс, который он породил (сценарий). ,

В Unix выполнение B с помощью execделает эту работу.


Не существует эквивалента, по крайней мере, не использования стандартных команд и программ Windows.
Джон Гарденье

Если вы пытаетесь запустить исполняемый файл, а не другой пакетный файл, нет (поддерживаемого / реалистичного) способа сделать это. Однако каналы ввода / вывода обычно наследуются приложениями, работающими в пакетном файле. Если вы можете описать, почему вы хотите это сделать, мы можем предложить альтернативные варианты.
Гарри Джонстон

Процесс A должен уже получить весь вывод B, если только скрипт не переопределит это. Это не работает?
Гарри Джонстон

Можно использовать Win32 API для организации смерти дочернего процесса, когда это происходит с родительским процессом, однако встроенная опция командной строки AFAIK отсутствует. Если я предоставлю некоторый исходный код (для Visual C ++), вы сможете его собрать?
Гарри Джонстон

@ Гарри, я разрываю сценарий с Java, поэтому, если идея состоит в том, чтобы процесс А использовал этот Win32 API, я боюсь, что это вряд ли сработает, хотя я благодарен за усилия. Лучше просто объяснить, что это невозможно, и я приму это как ответ.
Даниэль С. Собрал

Ответы:


7

AFAIK там нет. Windows не хватает, execv()как это делает bash exec. callработает для вызова командных файлов (просто, просто интерпретировать файл в текущем интерпретаторе, аналогично .команде bash ), но не для exes.

Это делает невозможным написание однострочных скриптов-оболочек для скриптов на любом языке в Windows. Вы всегда будете получать "Завершить пакетную работу?" дерьмо на Ctrl + C и уничтожение пакетного процесса (не Ctrl + C, скажем из диспетчера задач) не убьет дочерний процесс. Я сейчас ищу файл шаблона C, чтобы сделать эту упаковку.

ОБНОВЛЕНИЕ: Windows имеет _execv()свой уровень совместимости с POSIX в MSVCRT, но AFAIK (не проверял его) - это просто оболочка, CreateProcessпоэтому он всегда будет создавать новый процесс, он не сможет заменить текущий процесс.


2

Я думаю, что колл делает то, что вы хотите, но я не уверен на 100%.


4
Если вы хотите запустить один пакетный файл из другого, не запуская новый экземпляр cmd.exe, вызов является правильным ответом.
Гарри Джонстон

1

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

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%

это не делает ничего подобного exec...
Jakuje

-1
  • Выполнить пакетные файлы :call
  • Выполнение exe-файлов : команда не нужна, вызывайте ее напрямую/path/to/exe/something.exe
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.