2009-07-16 4 views

Antwort

32

Ja, verwenden Sie die Umleitung der Standardausgabe in eine Datei:

[Code] 

function NextButtonClick(CurPage: Integer): Boolean; 
var 
    TmpFileName, ExecStdout: string; 
    ResultCode: integer; 
begin 
    if CurPage = wpWelcome then begin 
    TmpFileName := ExpandConstant('{tmp}') + '\ipconfig_results.txt'; 
    Exec('cmd.exe', '/C ipconfig /ALL > "' + TmpFileName + '"', '', SW_HIDE, 
     ewWaitUntilTerminated, ResultCode); 
    if LoadStringFromFile(TmpFileName, ExecStdout) then begin 
     MsgBox(ExecStdout, mbInformation, MB_OK); 
     { do something with contents of file... } 
    end; 
    DeleteFile(TmpFileName); 
    end; 
    Result := True; 
end; 

Beachten Sie, dass es mehr als ein Netzwerkadapter sein, und folglich mehr MAC-Adressen zur Auswahl.

+2

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

+4

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

+0

für Unicode-Installation, muss verwenden: 'var ExecStdout: AnsiString;' – papo

12

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; 
+0

Vielen Dank für die Bereitstellung eines solchen detaillierten Beispiels. Du hast offensichtlich viele Probleme gelöst, um so weit zu kommen und hast mir viel Zeit gespart. Ich benutze dies mit 'tasklist' und' taskkill', um eine laufende App während der Installation und Deinstallation zu erkennen und zu beenden. –

+0

Ein kleines Problem in Ihrem Anwendungsbeispiel: Wenn die Exec erfolgreich ist, aber ResultCode <> 0, wird ResultCode mit dem Exit-Code des aufgerufenen Programms und nicht mit einem Windows-Fehler ausgefüllt, damit SysErrorMessage nicht die richtige Nachricht erhält. Außerdem kann ein Exit-Code ungleich Null manchmal in Ordnung sein. Ich würde empfehlen, ResultCode je nach Kontext separat zu testen. Weitere Informationen zu dieser Verwirrung finden Sie unter https://github.com/jrsoftware/issrc/issues/190. –

+0

Ja die Ausnahme Nachricht in dem Beispiel beruht auf Windows Exit-Codes => https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx – Tobias81

Verwandte Themen