Чи є еквівалент програми CMD для Windows CME оболонки Unix?


9

Чи є еквівалент у Windows "exec" Unix Shell? В основному, мені потрібно уникати форсування нового процесу, щоб зберегти вхідні / вихідні труби, а також ідентифікатор процесу.

Редагувати:

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

У Unix виконання B з execвиконує цю роботу.


Не існує еквівалента, принаймні, не використовуються стандартні команди та програми Windows.
— Джон Гарденєр

Якщо ви намагаєтеся запустити виконуваний файл, а не інший пакетний файл, способу цього зробити не існує (підтримується / реалістично). Однак канали вводу / виводу зазвичай успадковуються програмами, що працюють у пакетному файлі. Якщо ви можете описати, чому ви хочете це зробити, ми можемо запропонувати альтернативи.
— Гаррі Джонстон,

Процес A вже повинен отримати весь вихід B, якщо сценарій не перекриє це. Це не працює?
— Гаррі Джонстон,

За допомогою API Win32 можна домовитись про те, щоб дочірній процес загинув під час батьківського процесу, проте немає вбудованого параметра командного рядка AFAIK. Якщо я надаю вихідний код (для Visual C ++), чи можете ви його створити?
— Гаррі Джонстон,

@Harry Я розгалужую сценарій з Java, тому, якщо ідея полягає в тому, щоб процес A використовувати той Win32 API, я боюся, що це навряд чи вдасться, хоча я вдячний за зусилля. Краще просто пояснити це неможливо, і я прийму це як відповідь.
— Даніель К. Собрал

Відповіді:


7

АФАІК там немає. 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
  • Виконати batch-файли :call
  • Виконати exe-файли : команда не потрібна, викликайте її безпосередньо/path/to/exe/something.exe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.