4 Stimmen

Delphi: Warten, bis das Bat-Skript zu Ende ist

Ich habe eine Bat-Datei, die einige Operationen ausführt. Wie kann ich diese Datei von Delphi aus ausführen und warten, bis sie stoppt. So etwas wie das:

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

6voto

eKek0 Punkte 22479

Führt die angegebene Befehlszeile aus und wartet darauf, dass das durch die Befehlszeile gestartete Programm beendet wird. Gibt true zurück, wenn das Programm einen Exit-Code von Null liefert, und false, wenn das Programm nicht startet oder einen Fehlercode ungleich Null liefert.

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;

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

2voto

Hier ist etwas Code und ein Beispiel - unter Windows 7 funktioniert es gut und ist unsichtbar

(die Funktion ExeAndWait ist ausgeliehen).

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. Wenn Sie möchten, können Sie eine Batch-Datei zur Laufzeit mit der Klasse TStringList erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X