Execute a DOS command and capture the output #61
Here's a tip from Joe Donth that shows how to run and capture the output of
a "DOS" command using cmd.exe
(NT systems only?).
It works by running cmd.exe
with the command to be run passed
in CommandLine with the current directory optionally passed in
the Work. The command is run and the output is returned as a
string.
function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of AnsiChar; BytesRead: Cardinal; WorkDir: string; Handle: Boolean; begin Result := ''; 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 := Work; Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), 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 Buffer[BytesRead] := #0; Result := Result + Buffer; end; until not WasOK or (BytesRead = 0); WaitForSingleObject(PI.hProcess, INFINITE); finally CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally CloseHandle(StdOutPipeRead); end; end;
To test it, drop a TMemo, a TEdit and a TButton on a form. Set the button's click event handler as follows:
procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text := GetDosOutput(Edit1.Text); end;
Type the required command in the edit box, e.g. Help DIR
,
and click the button to display the output in the memo control.
Author: | Joe Donth |
---|---|
Contributor: | Joe Donth |
Added: | 2008/03/31 |
Last updated: | 2009/12/26 |