Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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)

p80286 14. Aug 2008 17:17

Re: [DOS] Ausgabe abfangen
 
Hallo zusammen,

naja man kann es schon steuern.
1) wenn Parameter übergeben werden, dann darf das Programm einlesen (von STDIN) ansonsten wird nur eine Fehlermeldung ausgegeben.
2) wenn Parameter übergeben werden, dann liest das Programm aus der übergebenen Datei ansonsten von STDIN.

Wenn ich mich richtig erinnere liefert Paramamstr(1) bei solchen Konstrukten
Meinprog.exe >papierkorb.txt
dann '>papierkorb.txt' zurück. Das Umleiten muß also vom Programm selbst erledigt werden.

Die andere Möglichkeit wäre es mit zwei Threads zu versuchen. Einer lauscht, und der andere dreht den Saft ab wenn nach x Sekunden keine Eingabe erfolgte.

Die Fragestellung erinnert mich ein wenig an meine Tochter. Wenn etwas machbar war, mußte es auch gemacht werden. Das ist jetzt allerdings auch schon 18 Jahre her.

Grüße
K-H

MSSSSM 14. Aug 2008 19:03

Re: [DOS] Ausgabe abfangen
 
Zitat:

Zitat von p80286
Wenn ich mich richtig erinnere liefert Paramamstr(1) bei solchen Konstrukten
Meinprog.exe >papierkorb.txt
dann '>papierkorb.txt' zurück. Das Umleiten muß also vom Programm selbst erledigt werden.

versuch mal
Meinprog.exe > papierkorb.txt

marabu 14. Aug 2008 20:11

Re: [DOS] Ausgabe abfangen
 
Hallo,

unabhängig von den mir unbekannten Absichten des Thread Owners möchte ich noch folgendes zu bedenken geben: Jede Konsolenanwendung sollte so geschrieben werden, dass Power-User nicht behindert werden. Eigentlich ist die Unterstützung der Standard I/O-Kanäle eine Entwurfsentscheidung, die aus verschiedenen Verarbeitungsszenarien folgt, z.B. eine Eingabedatei soll verändert werden und das Resultat soll als neue Datei weggeschrieben werden - die von Unix her bekannten filter tools arbeiten genau so. In diesem Fall erwarte ich die Verwendung von STDIN und STDOUT einfach. Da hier eine INI-Datei verarbeitet werden soll und Delphi die entsprechenden Klassen zur bequemen Verarbeitung solcherart strukturierter Textdateien anbietet, gilt es beides unter einen Hut zu bringen.

Delphi-Quellcode:
uses
  Classes,
  IniFiles,
  Windows,
  SysUtils;

var
  stream: TStream;
  strings: TStrings;
  ini: TMemIniFile;

begin
  ini := TMemIniFile.Create('');
  strings := TStringList.Create;
  if ParamCount = 0
    then stream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE))
    else stream := TFileStream.Create(ParamStr(1), fmOpenRead);
  strings.LoadFromStream(stream);
  stream.Free;
  ini.SetStrings(strings);
  strings.Free;
  if ini.SectionExists(SECTION) then
  begin {
    ... roll your own dice ...
} end;
  ini.Free;
end;
So wird ein im Programm festgeschriebener Dateiname vermieden, die Datei kann über piping oder redirection verarbeitet werden und auf den Inhalt kann bequem zugegriffen werden. Alternativ kann die Eingabedatei auch als Parameter übergeben werden.

Bei einem einfachen StringList.LoadFromFile('C:\BOOT.INI') wird die Einbettung in die Ablaufumgebung nicht berücksichtigt.

Freundliche Grüße

gammatester 14. Aug 2008 21:53

Re: [DOS] Ausgabe abfangen
 
Zitat:

Zitat von marabu
So wird ein im Programm festgeschriebener Dateiname vermieden, die Datei kann über piping oder redirection verarbeitet werden und auf den Inhalt kann bequem zugegriffen werden. Alternativ kann die Eingabedatei auch als Parameter übergeben werden.

Allerdings wird nicht zeilenweise von der Standardeingabe gelesen, wenn weder Dateiname noch piping oder redirection gewählt werden: Unter Win2000 wird nur 1 Zeile unter Win98 keine Zeile verarbeitet. Und das war ja wohl eine Vorgabe/Wunsch von Mogtar.

Gammatester

marabu 15. Aug 2008 05:58

Re: [DOS] Ausgabe abfangen
 
Moin,

ich hatte meinen Code in Beitrag #33 als unabhängig von Mogtars konkreten Anforderungen deklariert und mich nur auf das Problem der INI-Daten und deren Verarbeitung konzentriert, da das zeilenweise Verarbeiten ja schon früher im Thread gezeigt wurde, aber okay - hier die Verknüpfung der beiden Code-Teile, damit niemand stolpert:

Delphi-Quellcode:
program Demo;

{$APPTYPE CONSOLE}

uses
  Classes,
  IniFiles,
  Windows,
  SysUtils;

var
  stream: TStream;
  strings: TStrings;
  ini: TMemIniFile;
  h: THandle;
  ft: Cardinal;
  line: string;

const
  SECTION = 'boot loader';

begin
  ini := TMemIniFile.Create('');
  strings := TStringList.Create;
  h := GetStdHandle(STD_INPUT_HANDLE);
  ft := GetFileType(h);
  if ParamCount > 0 then
    stream := TFileStream.Create(ParamStr(1), fmOpenRead)
  else if ft <> FILE_TYPE_CHAR then
    stream := THandleStream.Create(h)
  else
    stream := nil;
  if Assigned(stream) then
  begin
    strings.LoadFromStream(stream);
    stream.Free;
  end else
  begin
    AssignFile(input, '');
    Reset(input);
    while not Eof do
    begin
      ReadLn(line);
      strings.Add(line);
    end;
    CloseFile(input);
  end;
  ini.SetStrings(strings);
  strings.Free;
  if ini.SectionExists(SECTION)
    then WriteLn('roll your own dice ...')
    else WriteLn('unexpected data found');
  ini.Free;
end.
Freundliche Grüße

turboPASCAL 15. Aug 2008 06:55

Re: [DOS] Ausgabe abfangen
 
[OT] Nanu, Delphi-Tags kaputt ? Sie sind eigentlich gesetzt...[/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.
Seite 4 von 4   « Erste     234   

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