AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Befehle im Terminal ausführen und Antwort erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Befehle im Terminal ausführen und Antwort erhalten

Ein Thema von mojo777 · begonnen am 16. Dez 2009 · letzter Beitrag vom 18. Dez 2009
Antwort Antwort
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#1

Befehle im Terminal ausführen und Antwort erhalten

  Alt 16. Dez 2009, 09:00
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
Muh macht die kUh
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 16. Dez 2009, 13:26
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 16. Dez 2009, 14:57
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
Heiko
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#4

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 18. Dez 2009, 09:03
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
Muh macht die kUh
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 18. Dez 2009, 09:59
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
Heiko
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#6

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 18. Dez 2009, 10:55
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ß!
Muh macht die kUh
  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 18. Dez 2009, 11:26
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
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#8

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 18. Dez 2009, 11:33
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:
RunCaptured(ExtractFilePath(Application.ExeName), 'findDb.bat', ''); Für mich ist das Problem erledigt.
Euch riesen Dank für Tipps!!
Muh macht die kUh
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Befehle im Terminal ausführen und Antwort erhalten

  Alt 18. Dez 2009, 12:14
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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