![]() |
Kommandozeilenprogramm ausführen und Ausgabe umleiten
Ich habe folgenden Code in einer Batchdatei:
dc64cmd.exe -listmonitors >w:\temp\monitors.txt Wie kann ich dc64cmd.exe mit Delphi starten und die Ausgabe in eine Datei umleiten? Auf den ersten Blick sehe ich weder bei ShellExecute() noch bei CreateProcess() eine Möglichkeit die Ausgabe in eine Datei umzuleiten. Danke im Voraus! |
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Einfach die Exe starten und die Parameter übergeben samt Dateiumleitung.
Delphi-Quellcode:
[edit] Achso, Kommandozeilenprogramm. Du kannst es auch so versuchen:
ShellExecute(0,'open','dc64cmd.exe','-listmonitors > w:\temp\monitors.txt',nil,SW_SHOW);
Delphi-Quellcode:
Ermitteln des Kommandointerpreters und Auswertung des Rückgabewertes habe ich alles weggelassen, das kannst Du ja noch implementieren ;) [/edit]
ShellExecute(0,'open','cmd.exe','/c dc64cmd.exe -listmonitors > w:\temp\monitors.txt',nil,SW_SHOW);
|
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Das diese Umleitung via > ein Feature des CommandLine-Interpreters sein dürfte, wirst du hierfür auch diesen (z.B. die cmd.exe) ansprechen müssen.
Ansonsten könntest du über ![]() |
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
![]() mfg Florian |
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Das ist dann aber doof wenn der Zwischenpuffer voll läuft. dann wartet das ausgeführte Programm darauf das dieser geleert wird, und das ausführende Programm wartet darauf das sich das Programm beendet, damit der Puffen geleert werden kann.
Ergo: Endloßschleife. Besser ist das hier:
Delphi-Quellcode:
const READ_BYTES = 2048; var proc:TProcess; S2: TStringList; M: TMemoryStream; n: LongInt; BytesRead: LongInt; begin M := TMemoryStream.Create; BytesRead := 0; proc:=TProcess.create; proc.Options:=[poUsePipes]; Proc.CommandLine :='WasAuchImmer.echse'; Proc.Execute; while Proc.Running do begin // stellt sicher daß wir Platz haben M.SetSize(BytesRead + READ_BYTES); // versuche es zu lesen n := Proc.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead, n); end else begin // keine Daten, warte 100 ms Sleep(100); end; end; // lese den letzten Teil repeat // stellt sicher daß wir Platz haben M.SetSize(BytesRead + READ_BYTES); // versuche es zu lesen n := Proc.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead, n); end; until n <= 0; M.SetSize(BytesRead); S2 := TStringList.Create; S2.LoadFromStream(M); //mache was mit dem Output... S2.Free; M.Free; proc.free; end; |
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Ich fleddere mal diese Leiche und ergänze die Frage: Hat sich vielleicht in den letzten 8 Jahren, seit dieser Thread erstellt wurde, in der RTL etwas getan? So dass Delphi möglicherweise das Pipen von Konsolenausgaben von Haus aus mit wenig Code ermöglicht?
|
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Nicht, dass ich wüsste.
Ich glaub aber sowas wie DOSBox mal im GetIt gesehn zu haben. |
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Zitat:
|
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
Ich habe diese Funktion eingesetzt um die Ausgabe von DCRaw in einen Stream umzuleiten.
Code:
vgl:
function GetDosOutput(CommandLine: string; Params: string; AStream : TStream): Integer;
var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of AnsiChar; BytesRead: Cardinal; WorkDir, AParameter: string; Handle: Boolean; begin Result := 0; with SA do begin nLength := SizeOf(SA); bInheritHandle := True; lpSecurityDescriptor := nil; end; CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0); try with SI do begin FillChar(SI, SizeOf(SI), 0); cb := SizeOf(SI); dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow := SW_HIDE; hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin hStdOutput := StdOutPipeWrite; hStdError := StdOutPipeWrite; end; WorkDir := 'C:\'; AParameter := Format('"%s" %s', [CommandLine, TrimRight(Params)]); Handle := CreateProcess(nil, PChar({'cmd.exe /C ' + }AParameter), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); CloseHandle(StdOutPipeWrite); if Handle then try repeat WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); if BytesRead > 0 then begin AStream.Write(Buffer[0],BytesRead); Result := Result + BytesRead; end; until not WasOK or (BytesRead = 0); WaitForSingleObject(PI.hProcess, INFINITE); finally CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally CloseHandle(StdOutPipeRead); end; end; ![]() Grüsse, Julian |
AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz