2010-03-14 4 views
4

У меня есть bat-файл, который выполняет некоторые операции. Как запустить этот файл из Delphi и подождать, пока он не остановится. Нечто подобное:Delphi: дождитесь окончания бит-скрипта

procedure TForm1.Button1Click(Sender: TObject); 
begin 
//Starting bat-file 
bla-bla-bla 
showmessage('Done'); 
end; 

ответ

5

Это выполняет данную командную строку и ждет программа, запускаемая из командной строки, чтобы выйти. Возвращает true, если программа возвращает нулевой код выхода и false, если программа не запускается или не возвращает ненулевой код ошибки.

function ExecAndWait(const CommandLine: string) : Boolean; 
var 
    StartupInfo: Windows.TStartupInfo;  // start-up info passed to process 
    ProcessInfo: Windows.TProcessInformation; // info about the process 
    ProcessExitCode: Windows.DWord;   // process's exit code 
begin 
    // Set default error result 
    Result := False; 
    // Initialise startup info structure to 0, and record length 
    FillChar(StartupInfo, SizeOf(StartupInfo), 0); 
    StartupInfo.cb := SizeOf(StartupInfo); 
    // Execute application commandline 
    if Windows.CreateProcess(nil, PChar(CommandLine), 
    nil, nil, False, 0, nil, nil, 
    StartupInfo, ProcessInfo) then 
    begin 
    try 
     // Now wait for application to complete 
     if Windows.WaitForSingleObject(ProcessInfo.hProcess, INFINITE) 
     = WAIT_OBJECT_0 then 
     // It's completed - get its exit code 
     if Windows.GetExitCodeProcess(ProcessInfo.hProcess, 
      ProcessExitCode) then 
      // Check exit code is zero => successful completion 
      if ProcessExitCode = 0 then 
      Result := True; 
    finally 
     // Tidy up 
     Windows.CloseHandle(ProcessInfo.hProcess); 
     Windows.CloseHandle(ProcessInfo.hThread); 
    end; 
    end; 
end; 

От: http://www.delphidabbler.com/codesnip?action=named&showsrc=1&routines=ExecAndWait

+4

Критический момент (командные файлы и командные файлы необходимо выполнить, передав их как параметры в 'cmd.exe', используя переключатель'/C'). – mghie

2

Вот код и пример - под Windows 7 прекрасно работает и является невидимым

(несильно ExeAndWait заимствовано).

function ExeAndWait(ExeNameAndParams: string; ncmdShow: Integer = SW_SHOWNORMAL): Integer; 
var 
    StartupInfo: TStartupInfo; 
    ProcessInformation: TProcessInformation; 
    Res: Bool; 
    lpExitCode: DWORD; 
begin 
    with StartupInfo do //you can play with this structure 
    begin 
     cb := SizeOf(TStartupInfo); 
     lpReserved := nil; 
     lpDesktop := nil; 
     lpTitle := nil; 
     dwFlags := STARTF_USESHOWWINDOW; 
     wShowWindow := ncmdShow; 
     cbReserved2 := 0; 
     lpReserved2 := nil; 
    end; 
    Res := CreateProcess(nil, PChar(ExeNameAndParams), nil, nil, True, 
     CREATE_DEFAULT_ERROR_MODE 
     or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation); 
    while True do 
    begin 
     GetExitCodeProcess(ProcessInformation.hProcess, lpExitCode); 
     if lpExitCode <> STILL_ACTIVE then 
      Break; 
     Application.ProcessMessages; 
    end; 
    Result := Integer(lpExitCode); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ExeAndWait(ExtractFilePath(Application.ExeName) + 'test.bat', SW_HIDE); 
    ShowMessage('Done!'); 
end; 

PS. Если вам нравится, вы можете создавать командный файл во время выполнения, используя класс TStringList.

Смежные вопросы