永发信息网

Delphi 如何一次执行多条CMD命令

答案:1  悬赏:0  手机版
解决时间 2021-02-13 14:01
Delphi 如何一次执行多条CMD命令
最佳答案

unit uDOS;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    btnRun: TButton;
    Label1: TLabel;
    lblCount: TLabel;
    btnSave: TButton;
    SaveDialog1: TSaveDialog;
    procedure btnRunClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
  private
    procedure RunDosCommand(Command: String; Output: TStrings);
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnRunClick(Sender: TObject);
var
    cm: String;
    sl: TStrings;
begin
    cm := Edit1.Text;
    if cm = '' then exit;
    sl := TStringList.Create;
    cm := 'cmd /c ' + cm;
    RunDosCommand(cm, sl);
    lblCount.Caption := '0';
    Memo1.Lines.Clear;
    Memo1.Lines.AddStrings(sl);
    lblCount.Caption := IntToStr(sl.Count) + ' ÐмǼ';
    sl.Free;
end;
procedure TForm1.RunDosCommand(Command: String; Output: TStrings);
var 
    hReadPipe: THandle;
    hWritePipe: THandle;
    SI: TStartUpInfo;
    PI: TProcessInformation;
    SA: TSecurityAttributes;
    BytesRead: DWORD;
    Avail,ExitCode,wrResult: DWORD;
    Dest: Array[0..1023] of Char;
    CmdLine: Array[0..512] of Char;
    TmpList: TStringList;
    osVer: TOSVERSIONINFO;
    tmpstr: AnsiString;
begin 
    osVer.dwOSVersionInfoSize := Sizeof(TOSVERSIONINFO);
    GetVersionEX(osVer); 
    if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
        SA.nLength := SizeOf(SA);
        SA.lpSecurityDescriptor := nil;//@SD;
        SA.bInheritHandle := True;
        CreatePipe(hReadPipe, hWritePipe, @SA, 0);
    end else CreatePipe(hReadPipe, hWritePipe, nil, 1024);
    try
        Screen.Cursor := crHourglass;
        FillChar(SI, SizeOf(SI), 0);
        SI.cb := SizeOf(TStartUpInfo);
        SI.wShowWindow := SW_HIDE;
        SI.dwFlags := STARTF_USESHOWWINDOW;
        SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
        SI.hStdOutput := hWritePipe;
        SI.hStdError := hWritePipe;
        StrPCopy(CmdLine, Command);
        if CreateProcess(nil, CmdLine, nil, nil, True,
                         NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
        begin
            ExitCode := 0;
            while ExitCode = 0 do begin
                wrResult := WaitForSingleObject(PI.hProcess, 500);
                if PeekNamedPipe(hReadPipe, @Dest[0], 1024, @Avail,
                                 nil, nil) then begin
                    if Avail > 0 then begin
                        TmpList := TStringList.Create;
                        try
                            FillChar(Dest, SizeOf(Dest), 0);
                            ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
                            TmpStr := Copy(Dest, 0, BytesRead-1);
                            TmpList.Text := TmpStr;
                            Output.AddStrings(TmpList);
                        finally
                            TmpList.Free;
                        end;
                    end;
                end;
                if wrResult <> WAIT_TIMEOUT then ExitCode := 1;
            end;
            GetExitCodeProcess(PI.hProcess, ExitCode);
            CloseHandle(PI.hProcess);
            CloseHandle(PI.hThread);
        end;
    finally
        CloseHandle(hReadPipe);
        CloseHandle(hWritePipe);
        Screen.Cursor := crDefault;
    end;
end;
procedure TForm1.btnSaveClick(Sender: TObject);
begin
    if Memo1.Lines.Count = 0 then exit;
    if SaveDialog1.Execute then begin
        Memo1.Lines.SaveToFile(SaveDialog1.Filename);
    end;
end;
end.追问
但是按照cmd上输入  无法运行
这个该怎么解决?
追答在DOS命令下方输入后,按“运 行"键(可以自己加入回车运行)。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
房地产公司工程岗位一般都有哪些?
有你在手 天下我有是什么意思?
【英语词性】英语有几种词性,分别是什么
宏莉副食店地址在什么地方,想过去办事
怡禾风景(南门)怎么去啊,有知道地址的么
发动机大修后声音大,各位车友有了解这个问题
AutoCAD2006中的所有快捷键命令都显示成了未
九桂子地址在什么地方,想过去办事
房屋评估费开发票怎么做账务处理
兰州妇幼保健院某个女大夫简直是毁了医院的名
【lettuce是什么意思】lettuce&cucumber-tone
在海湾报警系统中如何用手动报警按钮直接控制
关于下图所示区域地理特征的叙述,错误的是A.
过故人庄 拼音版
浙江讯奇科技有限公司怎么样
推荐资讯
哪个地方的化工泵最好
乐乐屋烧烤地址在哪,我要去那里办事
有时候突然有脑子里满是争吵的话
辽宁省鞍山市国家税务局地址在什么地方,想过
蓝天仁源堂大药房地址在哪,我要去那里办事
甲建筑企业与乙混凝土厂签订混凝土供应合同,
南昌市群众艺术馆地址有知道的么?有点事想过
怎样才能记住单词默写单词
【垂挂的近义词】垂挂的反义词
手机怎么连接电脑键盘
下瓦窑地址有知道的么?有点事想过去
BeautyFactoryStudio美丽车间服装工作室地址
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?