При выполнении командной строки 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, что является более правильным подходом.
При работе с командной строкой важно понимать, как работают различные параметры, такие как /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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.