Delphi 调用CMD命令行,路径包含空格处理方法

//执行CMD命令行并获取返回值
function TLeiDianApi.ExcuteDosCmd(CommandLine: string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  Handle: Boolean;
  preTickcount: Integer;
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;
    Handle := CreateProcess(nil,  //lpApplicationName: PChar
      PChar('cmd /c ' + CommandLine),  //lpCommandLine: PChar
      nil, //lpProcessAttributes: PSecurityAttributes
      nil, //lpThreadAttributes: PSecurityAttributes
      True, //bInheritHandles: BOOL
      0, //CREATE_NEW_CONSOLE
      nil, nil, SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
    try
      preTickcount := GetTickCount;
      repeat
        WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
        if BytesRead > 0 then
        begin
          Buffer[BytesRead] := #0;
          Result := Result + Buffer;
        end;
        if GetTickCount - preTickcount > 10 * 1000 then
        begin
          OutputDebugStringW(PChar('mz:ExcuteDosCmd timeOut'));
          Break;
        end;
      until not WasOK or (BytesRead = 0);
      WaitForSingleObject(PI.hProcess, INFINITE);
    finally
      CloseHandle(PI.hThread);
      CloseHandle(PI.hProcess);
    end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;

 tip:如果路径中包含空格,使用 "" 号即可

//夜神
function TLeiDianApi.KillAppByIndexAndName(index: DWORD; packageName: string): Boolean;
var
  sCmd: string;
  sOut: string;
begin
  sCmd := Format('"%s" killapp -index:%d -packagename:%s', [FConsolePath, index, packageName]);
  sOut := ExcuteDosCmd(sCmd);
  Result := True;
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值