Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [DOS] Ausgabe abfangen (https://www.delphipraxis.net/118755-%5Bdos%5D-ausgabe-abfangen.html)

DeddyH 14. Aug 2008 10:49

Re: [DOS] Ausgabe abfangen
 
Ich hab sowas auch noch nie gemacht, aber müsste da nicht ein EOF am Dateiende kommen?

RWarnecke 14. Aug 2008 10:51

Re: [DOS] Ausgabe abfangen
 
Ich habe mal im Internet diese Funktion gefunden :
Delphi-Quellcode:
function GetConsoleOutput(const Command: String; var Output, Errors: TStringList): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  if CreateProcess(nil, PChar(command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
  StartupInfo, ProcessInfo) then begin
    result:=true;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Output.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else begin
    result:=false;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;
Damit kann ich den Output eines Konsolenfensters auslesen.

Reinhardtinho 14. Aug 2008 10:53

Re: [DOS] Ausgabe abfangen
 
Zitat:

Zitat von Mogtar
ah das hat geholfen, allerdigns bekomme ich imemr nur die erste zeile der boot.ini :(
wie setze ich den Lesezeiger weiter?

Delphi-Quellcode:
var
  sOutput: string;
begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }


  repeat
    read(sOutPut);
    Write(sOutPut);
  until sOutPut <> '';



end.

ReadLn statt Read.

ReadLn liest die Zeile und setzt den Zeiger auf die nächste Zeile, während Read nur die Zeile einliest.

marabu 14. Aug 2008 10:54

Re: [DOS] Ausgabe abfangen
 
Hi

Delphi-Quellcode:
var
  line: string;

begin
  AssignFile(input, ''); //stdin
  AssignFile(output, ''); //stdout
  Reset(input);
  Rewrite(output);
  while not Eof do
  begin
    ReadLn(line);
    WriteLn(line);
  end;
  CloseFile(output);
  CloseFile(input);
end.
Grüße vom marabu

Andi1985 14. Aug 2008 10:55

Re: [DOS] Ausgabe abfangen
 
Zitat:

Zitat von Reinhardtinho
Zitat:

Zitat von Mogtar
ah das hat geholfen, allerdigns bekomme ich imemr nur die erste zeile der boot.ini :(
wie setze ich den Lesezeiger weiter?

Delphi-Quellcode:
var
  sOutput: string;
begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }


  repeat
    read(sOutPut);
    Write(sOutPut);
  until sOutPut <> '';



end.

ReadLn statt Read.

ReadLn liest die Zeile und setzt den Zeiger auf die nächste Zeile, während Read nur die Zeile einliest.

DAS geht genausowenig, ich erhalte nur die erste Zeile der Boot.ini..!

DeddyH 14. Aug 2008 10:56

Re: [DOS] Ausgabe abfangen
 
So simpel? Wer hätte das gedacht :lol:

Andi1985 14. Aug 2008 10:56

Re: [DOS] Ausgabe abfangen
 
Zitat:

Zitat von marabu
Hi

Delphi-Quellcode:
var
  line: string;

begin
  AssignFile(input, ''); //stdin
  AssignFile(output, ''); //stdout
  Reset(input);
  Rewrite(output);
  while not Eof do
  begin
    ReadLn(line);
    WriteLn(line);
  end;
  CloseFile(output);
  CloseFile(input);
end.
Grüße vom marabu

Das funktioniert. :)
vielen Dank an alle die mir geholfen haben! :)

[closed]

gammatester 14. Aug 2008 12:03

Re: [DOS] Ausgabe abfangen
 
Der Code aus den Beiträgen sollte natürlich angepasst werden. Wenn Du readln verwendest, sollte auch writeln verwendet werden. Un selbstverständlich hört man nicht auf wenn man irgendwas nichtleeres gelesen hat! (Also kein Wunder, daß Du nur die erste Zeile liest). Also ingesamt etwa so:
Delphi-Quellcode:
var
  sOutput: string;
begin
  while not eof(input) do begin
    readln(sOutPut);
    Writeln(sOutPut);
  end;
end.
Gruß Gammatester

Andi1985 14. Aug 2008 12:07

Re: [DOS] Ausgabe abfangen
 
mir ist aber noch etwas aufgefallen:
wenn ich nun meine exe normal aufrufe ohne Type C:\boot.ini | dann bleibt er bei EOF hängen :(

Hansa 14. Aug 2008 12:11

Re: [DOS] Ausgabe abfangen
 
Wiseo geht das hier nicht ?

Delphi-Quellcode:
var s : TStringList;
begin
  s.LoadFromFile ('C:\boot.ini');
Oder muss es komplizierter sein ? :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz