Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему родительский процесс cmd.exe не завершается после выполнения дочернего процесса PowerShell с параметром /K

Delphi , ОС и Железо , Windows

При выполнении командной строки cmd.exe с переданным аргументом powershell.exe, может возникнуть ситуация, когда после завершения работы powershell.exe, cmd.exe продолжает работать. Это происходит из-за особенностей работы самой командной строки Windows.

Описание проблемы

Пользователь столкнулся с проблемой, при которой родительский процесс cmd.exe не завершается после того, как дочерний процесс powershell.exe выполнил свою задачу и завершил работу. Это связано с использованием параметра /K при запуске cmd.exe.

Подробное описание параметров командной строки

Параметр /K в командной строке означает, что после выполнения указанной команды, командная строка останется открытой. В то время как параметр /C указывает на то, что после выполнения команды, командный интерпретатор должен быть закрыт.

Пример кода на Object Pascal (Delphi)

В приведенном коде функция ExecAndWait выполняет cmd.exe, передавая ему в качестве параметра powershell.exe. Однако, из-за использования параметра /K, cmd.exe не завершается после выполнения powershell.exe.

function ExecAndWait(const FileName, Params: string; const WindowState: Word): Boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  Result := False;
  CmdLine := '"' + FileName + '"' + Params;
  // ... (инициализация и вызов CreateProcess)
end;

Решение проблемы

Чтобы cmd.exe завершался после выполнения powershell.exe, необходимо использовать параметр /C вместо /K. Это позволит командному интерпретатору завершить работу после выполнения переданной команды.

Обновление функции ExecAndWait

Также рекомендуется обновить функцию ExecAndWait для более удобного использования, избавив от необходимости явно добавлять пробел между путем к исполняемому файлу и параметрами.

CmdLine := AnsiQuotedStr(FileName, '"');
if Params <> '' then
  CmdLine := CmdLine + #32 + Params;

Альтернативный способ запуска

Вместо запуска cmd.exe с параметром powershell.exe, можно напрямую запустить powershell.exe, что является более правильным подходом.

ExecAndWait('<path to>\powershell.exe', Command, SW_HIDE);

Заключение

При работе с командной строкой важно понимать, как работают различные параметры, такие как /K и /C, чтобы корректно управлять поведением процесса cmd.exe. Использование прямого запуска powershell.exe без участия cmd.exe является предпочтительным вариантом.

Создано по материалам из источника по ссылке.

Пользователь запустил командную строку cmd.exe с параметром /K, который указывает на необходимость сохранения окна командной строки открытым после выполнения подкоманды, в данном случае дочернего процесса PowerShell, что приводит к тому, что cmd.exe не з


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 18:04:06/0.0021851062774658/0