Как я могу ждать завершения программы командной строки? - PullRequest
5 голосов
/ 28 ноября 2010

Я запустил программу с параметрами командной строки.Как я могу дождаться его окончания?

Ответы [ 5 ]

11 голосов
/ 28 ноября 2010

Это мой ответ: (Спасибо всем)

uses ShellAPI;

function TForm1.ShellExecute_AndWait(FileName: string; Params: string): bool;
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin

  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    exInfo.lpVerb := 'open';
    exInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.hProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Result := true;
    exit;
  end;
  while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);

  Result := true;

end;
7 голосов
/ 28 ноября 2010

Если я правильно понимаю ваш вопрос, вы хотите выполнить программу в командной строке и записать ее вывод в приложении, а не в окне консоли. Для этого вы можете прочитать вывод, используя pipe . Вот пример исходного кода:

Захват вывода из окна DOS (команда / консоль)

4 голосов
/ 28 ноября 2010

Использование DSiWin32 :

sl := TStringList.Create;
if DSiExecuteAndCapture('cmd.exe /c dir', sl, 'c:\test', exitCode) = 0 then
  // exec error
else
  // use sl
sl.Free;
2 голосов
/ 28 ноября 2010

Если вам нужно выполнить исполняемый файл командной строки и получить ответ, который этот exe-файл записывает в консоль, самый простой способ - вызвать exe-файл из пакетного файла и перенаправить вывод в другой файл, используя >, а затем прочитайте этот файл.

Например, если вам нужно выполнить команду "dir" и получить ее вывод, вы можете получить пакетный файл с именем getdir.bat, который содержит следующее:

@echo off
dir c:\users\myuser\*.* > output.txt

вы можете выполнить этот пакетный файл, используя функцию API ShellExecute. Вы можете прочитать об этом http://delphi.about.com/od/windowsshellapi/a/executeprogram.htm

Затем вы можете прочитать выходной файл, даже используя что-то вроде TStringList:

var
  output: TStringList;
begin
  output := TStringList.Create();
  output.LoadFromFile('output.txt');
  ...
2 голосов
/ 28 ноября 2010

Хорошо, получая параметры командной строки, вы используете

ParamCount: возвращает количество параметров, переданных программе в командной строке.

ParamStr: возвращаетконкретный параметр, запрашиваемый по индексу. Запуск приложений Dephi с параметрами

Теперь, если вы имели в виду чтение и запись в консоль, вы используете

WriteLn: записывает строку текстаconsole.

ReadLn: считывает строку текста из консоли в виде строки. Основы Delphi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...