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;
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
Để 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 –
để cài đặt unicode, phải sử dụng: 'var ExecStdout: AnsiString;' – papo