Einzelnen Beitrag anzeigen

Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#6

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 15:32
@CCRDude

Das Problem ist, dass bei einem Aufruf von "push" keine Daten über die Pipe ankommen.
Also die von mir beschriebene Ausgabe, die man eigentlich in der Konsole sehen würde (der Fortschritt usw.), kommt bei einem "push" gar nicht über die Pipe an.
Bei diesen Aufruf läuft git - je nachdem wie lange der Upload dauert - im Hintergrund, ohne das ich über die Pipe irgendwelche Daten bekomme.

Bei einem "status" oder "init" oder "add" usw. kommen die Ausgaben der Konsole in der Pipe an und ich kann diese auch entsprechend mitloggen.
Aber bei einem "push" bleibt es eben komplett leer...

Hier mal der Ausschnitt, den ich verwende:
an "Callback" wird der Inhalt der Pipe übergeben. Also die jeweilige Konsolen-Ausgabe.

Delphi-Quellcode:
  saSecurity.nLength := SizeOf(TSecurityAttributes);
  saSecurity.bInheritHandle := true;
  saSecurity.lpSecurityDescriptor := nil;
  if CreatePipe(hRead, hWrite, @saSecurity, 0) then
  begin
    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);

                if Assigned(CallBack) then
                begin
                  pOutput := string(dBuffer);
                  CallBack(dBuffer);
                end;
              until (dRead < CReadBuffer);
            Application.ProcessMessages;
          until (dRunning <> WAIT_TIMEOUT);

          GetExitCodeProcess(piProcess.hProcess, exitcode);
        finally
          CloseHandle(piProcess.hProcess);
          CloseHandle(piProcess.hThread);
        end;
    finally
      CloseHandle(hRead);
      CloseHandle(hWrite);
    end;
  end;
  Mit Zitat antworten Zitat