2009-07-16 40 views

Trả lời

32

Vâng, sử dụng chuyển hướng của đầu ra tiêu chuẩn vào một tệp:

[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; 

Lưu ý rằng có thể có nhiều hơn một bộ chuyển đổi mạng, và hậu quả là nhiều địa chỉ MAC để lựa chọn.

+2

Lưu ý rằng thay vì cứng mã hóa "cmd.exe "thực hành tốt hơn để sử dụng' ExpandConstant ('{cmd}') '. (Tất nhiên, tốt hơn là vẫn sử dụng các API thích hợp thay vì cố gắng nắm bắt đầu ra của các lệnh giao diện điều khiển, vì lệnh sau có thể thay đổi mà không cần thông báo, vì nó dành cho con người.) – Miral

+4

Để làm rõ: bạn cần chạy chương trình của mình thông qua lệnh nhắc để chuyển hướng. Ban đầu tôi nhìn vào câu trả lời này và bối rối vì sao điều này không hiệu quả với tôi, lý do là vì tôi không nhận ra chuyển hướng là một chức năng của dấu nhắc lệnh thay vì cửa sổ, vì vậy bạn cần Exec trên cmd.exe/c

+0

để cài đặt unicode, phải sử dụng: 'var ExecStdout: AnsiString;' – papo

12

Tôi phải làm như vậy (thực hiện lệnh gọi dòng lệnh và nhận kết quả) và đưa ra giải pháp tổng quát hơn.

Nó cũng sửa lỗi lạ nếu đường dẫn được trích dẫn được sử dụng trong các cuộc gọi thực tế bằng cách sử dụng cờ /S cho cmd.exe.

{ 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; 

Cách sử dụng:

Success := 
    ExecWithResult('ipconfig', '/all', '', SW_HIDE, ewWaitUntilTerminated, 
    ResultCode, ExecStdout) or 
    (ResultCode <> 0); 

Kết quả cũng có thể được nạp vào một đối tượng TStringList để có được tất cả các dòng:

Lines := TStringList.Create; 
Lines.Text := ExecStdout; 
{ ... some code ... } 
Lines.Free; 
+0

Cảm ơn rất nhiều vì đã cung cấp ví dụ chi tiết như vậy. Bạn rõ ràng đã làm việc thông qua rất nhiều vấn đề để có được điều này đến nay và đã cứu tôi rất nhiều thời gian. Tôi đang sử dụng lệnh này với 'tasklist' và' taskkill' để phát hiện và tiêu diệt một ứng dụng đang chạy trong quá trình cài đặt và gỡ cài đặt. –

+0

Một vấn đề nhỏ trong ví dụ Sử dụng của bạn: nếu Exec thành công nhưng ResultCode <> 0, ResultCode sẽ được điền bằng mã thoát của chương trình được gọi, không phải do lỗi cửa sổ, vì vậy SysErrorMessage sẽ không nhận được thông báo chính xác. Ngoài ra, một mã thoát khác không đôi khi có thể không sao. Tôi khuyên bạn nên thử nghiệm ResultCode riêng biệt tùy thuộc vào ngữ cảnh. Thông tin thêm về sự nhầm lẫn này: https://github.com/jrsoftware/issrc/issues/190. –

+0

Có thông báo ngoại lệ trong ví dụ dựa trên windows exit-codes => https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx – Tobias81

Các vấn đề liên quan