Захват Dos Window Progress - PullRequest
       77

Захват Dos Window Progress

0 голосов
/ 11 июня 2018

Я использую код в конце моего вопроса для захвата выходных данных приложений dos.

Я пытаюсь получить выходные данные команды 7z.exe ниже:

7z.exe x -y "C: \ Linux.iso" -o "E: \"

7z.exe показывает прогресс в конце своего окна DOS, например% 14 ..,%15 ...,% 16 ... Но это не добавляет новые строки для каждого прогресса.Это обновление последней строки окна вывода DOS.Таким образом, последняя строка окна dos изменяется следующим образом:% 14 ..,% 15 .., .. и 100%.

Я не могу захватить этот% 14 ..,% 15,% 16 ..прогресс.Я пытаюсь найти решение в течение нескольких дней.Как я могу захватить эти тексты прогресса?

-

Примечание: код работает и отлично захватывает вывод с помощью таких команд, как ping:

ping 127.0.0.1

Проблема заключается в захвате вывода окна душ, который не добавляет новую строку, обновляет строку.

// Source: https://thundaxsoftware.blogspot.com/2012/12/capturing-console-output-with-delphi.html#comment-form_7827048960744956444
//
// @Author: Jordi Corbilla
// (c) Copyright by Jordi Corbilla.
// Anonymous procedure approach by Lars Fosdal

type
    TArg<T> = reference to procedure(const Arg: T);

procedure TForm1.CaptureConsoleOutput(const ACommand, AParameters: String; CallBack: TArg<PAnsiChar>);
const
  CReadBuffer = 2400;
var
  saSecurity: TSecurityAttributes;
  hRead: THandle;
  hWrite: THandle;
  suiStartup: TStartupInfo;
  piProcess: TProcessInformation;
  pBuffer: array [0 .. CReadBuffer] of AnsiChar;
  dBuffer: array [0 .. CReadBuffer] of AnsiChar;
  dRead: DWORD;
  dRunning: DWORD;
  dAvailable: DWORD;
begin
  saSecurity.nLength := SizeOf(TSecurityAttributes);
  saSecurity.bInheritHandle := true;
  saSecurity.lpSecurityDescriptor := nil;
  if CreatePipe(hRead, hWrite, @saSecurity, 0) then
    try
      FillChar(suiStartup, SizeOf(TStartupInfo), #0);
      suiStartup.cb := SizeOf(TStartupInfo);
      suiStartup.hStdInput := hRead;
      suiStartup.hStdOutput := hWrite;
      suiStartup.hStdError := hWrite;
      suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
      suiStartup.wShowWindow := SW_HIDE;
      if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity, @saSecurity, true, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup,
        piProcess) then
        try
          repeat
            dRunning := WaitForSingleObject(piProcess.hProcess, 100);
            PeekNamedPipe(hRead, nil, 0, nil, @dAvailable, nil);
            if (dAvailable > 0) then
              repeat
                dRead := 0;
                ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
                pBuffer[dRead] := #0;
                OemToCharA(pBuffer, dBuffer);
                CallBack(dBuffer);
              until (dRead < CReadBuffer);
            Application.ProcessMessages;
          until (dRunning <> WAIT_TIMEOUT);
        finally
          CloseHandle(piProcess.hProcess);
          CloseHandle(piProcess.hThread);
        end;
    finally
      CloseHandle(hRead);
      CloseHandle(hWrite);
    end;
end;
...