Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Befehle im Terminal ausführen und Antwort erhalten (https://www.delphipraxis.net/144774-befehle-im-terminal-ausfuehren-und-antwort-erhalten.html)

mojo777 16. Dez 2009 08:00


Befehle im Terminal ausführen und Antwort erhalten
 
Hallo Leute,

ich wollte heute "mal eben" ein Konsolen-Skript aus delphi aus starten. Es soll mir hautsächlich den Ort einer datenbankdatei (interbase) liefern .
Das Ergebnis soll dann weiterverarbeitet werden.

Jetzt habe ich StartProcess (oder so ähnlichen Befehl) gesehen, wo man nur synchron auf das Ende warten kann ohne aber die Rückgaben zu erhalten.

Es hat jemand einen link zur Komponenten TConsole hier mal gepostet, aber die Komponenten gibts nich tmehr.



Wüsste jemand, wie ich denn so ein auf den ersten Blick einfaches problem lösen kann?
Würde mich über alle tipps freuen!


Viele Grüße
Eugen

Astat 16. Dez 2009 12:26

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Hallo mojo777, try this.


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;
lg. Astat

hoika 16. Dez 2009 13:57

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Hallo,

Zitat:

Es soll mir hautsächlich den Ort einer datenbankdatei (interbase) liefern .
Wieso machst du das mit einem Script ?
Was genau macht das Script ?


Heiko

mojo777 18. Dez 2009 08:03

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Hi Astat, riesen dank für die Funktion!
Ich bin leider erst eben dazu gekommen sie zu testen. Ohne jetzt genau geschaut zu haben warum, wird eine leere ergebnismenge zurückgeliefert. Auch für den Befehl
Zitat:

dir c:\
Auf welchen Systemen hast du die Funktion schon alles getestet? Ich habe jetzt lediglich WinXp Sp3

Heiko,
ich brauche das Skript um der Ort einer Datenbank irgendwo im Ordner c:\programme zu finden. Die alten Versionen meines Programms haben nicht den Pfad in die regedit gespeichert.


Danke für anwtowrten!

ich werde mich dann mal an das testen der methode von astat machen. ansonsten freu ich mich weiter über ale meldungen.

viele grüße
eugen

hoika 18. Dez 2009 08:59

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Hallo,

d.h. du hast irgendwo unter c:\programme eine gdb liegen
und suchst sie per dir ???

Argz. ;)

Davon angesehen, dass c:\programme keine veränderbaren Dateien gehören,
geht das auch über

FindFirst
FindNext

Dazu gibt es hier auch Threads ala "Datei suchen mit Unterverzeichnissen"


Heiko

mojo777 18. Dez 2009 09:55

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Hi Heiko,
danke für den Tipp!
Und eigentlich dachte ich eher an den befehl
Zitat:

dir c:\Programme /s /b | find "datenbank.gdb"
Werd mir gleich aber mal die ergebnisse der suche anschauen.

gruß!

WoGe 18. Dez 2009 10:26

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Zitat:

Zitat von mojo777
Zitat:

dir c:\Programme /s /b | find "datenbank.gdb"

Meine "DOS" Kenntnisse sin zwar ein wenig eigerostet, aber
folgendes geht doch wohl noch:

Zitat:

dir c:\Programme /s /b | find "datenbank.gdb > Meinfile.txt
Gruss wo

mojo777 18. Dez 2009 10:33

Re: Befehle im Terminal ausführen und Antwort erhalten
 
hehe, ja daran habe ich auch schon gedacht. würd ich auch nutzen, wenn alles andere mislingen würde. wäre aber schon ein armutszeugnis für windows...

whatever. habe jetzt die Lösung:

Habe die Funktion aus dem Beitrag zum selben Thema genommen.
Man muss jedoch aufpassen, da der Befehl "dir" wohl kein Prozess im Windows-Sinn ist und deshalb die Fehlermeldung "Datei nicht gefunden" kommt.
Ich habe nun eine batch Datei
Zitat:

findDb.bat
erstellt, mit folgendem Inhalt:
Zitat:

@echo off
dir c:\Programme /s /b | find /I "datenbank.gdb"
Der Aufruf aus dem Delphicode sieht dann folgendermaßen aus:
Delphi-Quellcode:
RunCaptured(ExtractFilePath(Application.ExeName), 'findDb.bat', '');
Für mich ist das Problem erledigt. :)
Euch riesen Dank für Tipps!!

hoika 18. Dez 2009 11:14

Re: Befehle im Terminal ausführen und Antwort erhalten
 
Hallo,

Zitat:

hehe, ja daran habe ich auch schon gedacht. würd ich auch nutzen, wenn alles andere mislingen würde. wäre aber schon ein armutszeugnis für windows...
mir ging es eher darum,
auf DOS-Kommandos (jaja, ist es nicht mehr) zuzugreifen,
statt einen schicken Code zu schreiben.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr.

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