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 |
Re: Befehle im Terminal ausführen und Antwort erhalten
Hallo mojo777, try this.
Delphi-Quellcode:
lg. Astat
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; |
Re: Befehle im Terminal ausführen und Antwort erhalten
Hallo,
Zitat:
Was genau macht das Script ? Heiko |
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:
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 |
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 |
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:
gruß! |
Re: Befehle im Terminal ausführen und Antwort erhalten
Zitat:
folgendes geht doch wohl noch: Zitat:
|
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:
Zitat:
Delphi-Quellcode:
Für mich ist das Problem erledigt. :)
RunCaptured(ExtractFilePath(Application.ExeName), 'findDb.bat', '');
Euch riesen Dank für Tipps!! |
Re: Befehle im Terminal ausführen und Antwort erhalten
Hallo,
Zitat:
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