想要调用cmd.exe,执行命令后,如何让黄色字不回显?

wdywmz 2021-02-10 11:23:09
想要调用cmd.exe,执行命令后,如何让黄色字不回显?
其他内容正常回显,而且不要隐藏cmd的窗口。 只是想不显示黄色的文字,我要把命令隐藏起来,不想让客户知道我运行了什么命令,因为这些命令是我花费了时间研究出来的。

而且必须 实时通过我的主程序 postmessage 命令给 cmd窗口,让窗口来执行。
或者你有更好的办法也行。谢谢。

...全文
2809 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cranley 2023-07-03
  • 打赏
  • 举报
回复


function RunCommand(const cmd: string; list: TStrings): string;
var
  hReadPipe, hWritePipe: THandle;
  si: STARTUPINFO;
  lsa: SECURITY_ATTRIBUTES;
  pi: PROCESS_INFORMATION;
  cchReadBuffer: DWORD;
  pOutStr: PAnsiChar; // or PChar;
  res, strCMD: string;
  fname: PChar;
begin
  strCMD := cmd;
  pOutStr := AllocMem(5000);
  fname := AllocMem(255);
  lsa.nLength := SizeOf(SECURITY_ATTRIBUTES);
  lsa.lpSecurityDescriptor := nil;
  lsa.bInheritHandle := True;
  try
    if not CreatePipe(hReadPipe, hWritePipe, @lsa, 0) then
      Exit;

    FillChar(si, SizeOf(STARTUPINFO), 0);
    si.cb := SizeOf(STARTUPINFO);
    si.dwFlags := (STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
    si.wShowWindow := SW_Hide;
    si.hStdOutput := hWritePipe;
    StrPCopy(fname, strCMD);
    try

      if not CreateProcess(nil, PChar(fname), nil, nil, True, 0, nil, nil,
        si, pi) then
        Exit;
      try
        while (True) do
        begin
          if not PeekNamedPipe(hReadPipe, pOutStr, 1, @cchReadBuffer, nil, nil)
          then
            break;
          if cchReadBuffer <> 0 then
          begin
            if not ReadFile(hReadPipe, pOutStr^, 4096, cchReadBuffer, nil) then
              break;
            pOutStr[cchReadBuffer] := chr(0);
            // if @Show <> nil then Show(pOutStr);
            list.Add(pOutStr);
          end
          else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then
            break;
          Sleep(10);
          Application.ProcessMessages;
        end;
        pOutStr[cchReadBuffer] := chr(0);
        list.Add(pOutStr);
      finally
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        CloseHandle(hWritePipe);
      end;
    finally
      CloseHandle(hReadPipe);
    end;

  finally
    FreeMem(pOutStr);
    FreeMem(fname);
  end;

  Result := res;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  cmd: string;

begin
  cmd := 'ping baidu.com ';
  RunCommand(cmd, Memo1.Lines);
end;

办法就是跳过cmd命令,自己用管道来显示程序输出。比如上面的代码将ping 命令输出到memo1上面。
多个命令就多跑几次RunCommand。
这个办法就不会有什么CMD窗口了,显示输出接管在自己的程序里面,更方便些 。

墨梅无痕 2021-02-14
  • 打赏
  • 举报
回复
楼主的想法是不可行的,你无法控制cmd窗口自身的显示,解决办法只有自己写一个窗口来显示命令执行的结果。
wdywmz 2021-02-12
  • 打赏
  • 举报
回复
命令是动态生成的,楼上2位办法不行。
我在地球 2021-02-11
  • 打赏
  • 举报
回复
@echo off 行不?
doloopcn 2021-02-10
  • 打赏
  • 举报
回复
1.使用@echo off

2.使用:命令 >任意名称
任意名称实质上就是一个文件,命令的结果都生成在“任意名称”的文件中,但不显示在屏幕,你需要手工或自动删除“任意名称”文件
Re: 《Linux 系统常用内置命令》  ---------------------------------------内容提要:     01. Linux内置命令概述;两栖命令 echo pwd kill 等等    02. 判断内置命令的方式;help -d [command] 能够正常回显    03. 内置命令在 shell 脚本中的基础应用介绍    04. 内置命令 alias 和 unalias 自定义别名和删除别名;临时生效与永久生效    05. 后台前台 出将入相 腾腾转 任务相关命令 bg fg jobs    06. SHELL 循环的处理方式 break continue exit    07. 常见 builtin 内置命令 eval exit export history    08. 内置命令 read 交互式赋值变量;type 判断命令类型    09. 内置命令 ulimit 修改系统资源使用限制;unset 清空变量  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述!  《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧