捕获所有命令输出

时间:2015-03-13 12:51:52

标签: winapi freepascal output-redirect

我想捕获cmd.exe输出并在我正在制作的不同gui中显示它。我想创建一个具有扩展功能的命令解释器。 dir命令完美无缺,当我尝试执行另一个像ipconfig这样的进程时,问题就出现了。

我没有看到ipconfig输出。那是否有一个工作场所?!

我使用Lazarus的TProcess组件(FreePascal)

  proc := TProcess.Create(nil);
  proc.Options:= [poUsePipes, poNoConsole];
  proc.ShowWindow:= swoHIDE;
  proc.Executable:= 'cmd'; 

读取输出线程:

  if (Length(cmd) > 0) then
         begin
         cmd := cmd + #13#10;
         proc.Input.Write(cmd[1], Length(cmd)); // here I write command from user
         strikes := 0;
         end
      else
      if proc.Output.NumBytesAvailable > 0 then
      begin
           while proc.Output.NumBytesAvailable > 0 do
           begin
                FillChar(buf, sizeof(buf), #0);
                proc.Output.Read(buf, sizeof(buf) - 1);
                data := data + buf;
           end;                    

         // data gets echoed to user 

2 个答案:

答案 0 :(得分:1)

它适用于我(我使用FPC 3.1.1和Lazarus 1.5,但我希望它没关系):

proc.Options:= [poUsePipes];
proc.ShowWindow:= swoHIDE;
proc.Executable:= 'cmd'; 
...

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
    cmd: String;
begin
    if Key = #13 then
    begin
        Key := #0;
        if not proc.Active then
            proc.Active := True;
        cmd := Edit1.Text + LineEnding;
        proc.Input.Write(cmd[1], Length(cmd));
    end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
    buf: array[0..65535] of Char;
begin
    if proc.Output.NumBytesAvailable > 0 then
    begin
        while proc.Output.NumBytesAvailable > 0 do
        begin
            FillChar(buf, sizeof(buf), #0);
            proc.Output.Read(buf, sizeof(buf) - 1);
            Memo1.Lines.Add(buf);
        end;
    end;
end;

我猜你只是没有正确捕捉过程输出。 祝你好运。

PS:如果你需要创建一些类似Windows控制台的应用程序,我认为最好的方法是使用Windows console API而不是跨平台的Lazarus组件。

PPS:使用Lazarus使用CmdLine组件模拟控制台外观和行为。

答案 1 :(得分:1)

一般来说,首先检查简短示例是否无法解决问题是明智的:

e.g。

uses process;

var s : ansistring;
begin
  runcommand('ipconfig',['/all'],s);
  writeln(s);
end.

工作正常,省去了很多麻烦。 (FPC 2.6.2+虽然)