Ich musste das gleiche tun (Ausführen von Befehlszeilenaufrufen und das Ergebnis erhalten) und kam mit einer allgemeineren Lösung.
Es behebt auch seltsame Fehler, wenn zitierte Pfade in den tatsächlichen Aufrufen verwendet werden, indem das Flag /S
für cmd.exe
verwendet wird.
{ Exec with output stored in result. }
{ ResultString will only be altered if True is returned. }
function ExecWithResult(const Filename, Params, WorkingDir: String; const ShowCmd: Integer;
const Wait: TExecWait; var ResultCode: Integer; var ResultString: String): Boolean;
var
TempFilename: String;
Command: String;
begin
TempFilename := ExpandConstant('{tmp}\~execwithresult.txt');
{ Exec via cmd and redirect output to file. Must use special string-behavior to work. }
Command :=
Format('"%s" /S /C ""%s" %s > "%s""', [
ExpandConstant('{cmd}'), Filename, Params, TempFilename]);
Result := Exec(ExpandConstant('{cmd}'), Command, WorkingDir, ShowCmd, Wait, ResultCode);
if not Result then
Exit;
LoadStringFromFile(TempFilename, ResultString); { Cannot fail }
DeleteFile(TempFilename);
{ Remove new-line at the end }
if (Length(ResultString) >= 2) and (ResultString[Length(ResultString) - 1] = #13) and
(ResultString[Length(ResultString)] = #10) then
Delete(ResultString, Length(ResultString) - 1, 2);
end;
Verbrauch:
Success :=
ExecWithResult('ipconfig', '/all', '', SW_HIDE, ewWaitUntilTerminated,
ResultCode, ExecStdout) or
(ResultCode <> 0);
Das Ergebnis auch in ein TStringList
Objekt geladen werden kann, um alle Linien zu erhalten:
Lines := TStringList.Create;
Lines.Text := ExecStdout;
{ ... some code ... }
Lines.Free;
Beachten Sie, dass anstatt Hartcodierung „cmd.exe "Es ist besser,' ExpandConstant ('{cmd}') '' zu verwenden. (Natürlich ist es besser, die richtigen APIs zu verwenden, anstatt zu versuchen, die Ausgabe von Konsolenbefehlen zu erfassen, da sich letztere ohne vorherige Ankündigung ändern kann, da sie für Menschen gedacht ist.) – Miral
Zur Verdeutlichung: Sie müssen Ihr Programm über den Befehl ausführen Aufforderung zur Umleitung. Ich schaute zuerst auf diese Antwort und war verwirrt, warum das für mich nicht funktionierte, der Grund war, weil ich nicht erkannte, dass die Umleitung eine Funktion der Eingabeaufforderung und nicht Windows ist, so dass Sie Exec auf cmd.exe/c ausführen müssen –
für Unicode-Installation, muss verwenden: 'var ExecStdout: AnsiString;' – papo