C ++执行CMD命令

时间:2012-07-19 15:51:19

标签: c++ windows winapi cmd windows-console

我在这里遇到了严重的问题。我需要通过C ++执行CMD命令行,而不显示控制台窗口。因此我无法使用system(cmd),因为窗口会显示。

我尝试了winExec(cmd, SW_HIDE),但这也不起作用。 CreateProcess是我尝试的另一个。但是,这适用于运行程序或批处理文件。

我最终尝试ShellExecute

ShellExecute( NULL, "open",
    "cmd.exe",
    "ipconfig > myfile.txt",
    "c:\projects\b",
    SW_SHOWNORMAL
);

任何人都可以看到上述代码有什么问题吗?我使用SW_SHOWNORMAL直到我知道这有用。

我真的需要一些帮助。没有任何事情发生,我已经尝试了很长一段时间。任何人都可以给出任何建议都很棒:)

6 个答案:

答案 0 :(得分:8)

将输出重定向到您自己的管道是一个更整洁的解决方案,因为它避免了创建输出文件,但这很好用:

ShellExecute(0, "open", "cmd.exe", "/C ipconfig > out.txt", 0, SW_HIDE);

您没有看到cmd窗口,输出会按预期重定向。

您的代码可能失败(除了/C之外),因为您将路径指定为"c:\projects\b"而不是"c:\\projects\\b"

答案 1 :(得分:5)

这是我的DosExec函数实现,允许(静默)执行任何DOS命令并将生成的输出检索为unicode字符串。

req

答案 2 :(得分:4)

您应该使用cmd.exe上的CreateProcess/C参数来隧道传输ipconfig命令。 >在命令行上本身不起作用。你必须redirect programmatically the stdout

答案 3 :(得分:1)

我在github上有一个类似的程序[windows7和10测试]

https://github.com/vlsireddy/remwin/tree/master/remwin

这是服务器程序

  1. 侦听"本地连接" Windows端口为UDP端口命名接口(5555)并接收udp数据包。
  2. 收到udp数据包内容在cmd.exe上执行[请不要在运行命令后关闭cmd.exe并且输出字符串[执行命令的输出]通过相同的udp端口反馈到客户端程序]。
  3. 换句话说, 在udp数据包中收到的命令 - >解析udp数据包 - >在cmd.exe上执行 - >输出在同一端口上发送回客户端程序
  4. 这不会显示"控制台窗口" 无需人员在cmd.exe上手动执行命令 remwin.exe可以在后台运行,也可以是瘦服务器程序

答案 4 :(得分:0)

要添加到@CédricFrançoys的答案中,我修复了他在Windows构建中的代码中的一些问题:

缺少函数定义:

要编译代码,请添加以下函数定义:

#define UNICODEtoANSI(str)   WCHARtoCHAR(str, CP_OEMCP)

LPSTR WCHARtoCHAR(LPWSTR wstr, UINT codePage) {
    int len = (int)wcslen(wstr) + 1;    
    int size_needed = WideCharToMultiByte(codePage, 0, wstr, len, NULL, 0, NULL, NULL);
    LPSTR str = (LPSTR)LocalAlloc(LPTR, sizeof(CHAR) * size_needed);
    WideCharToMultiByte(codePage, 0, wstr, len, str, size_needed, NULL, NULL);
    return str;
}

不安全的CRT字符串函数调用:

要编译代码,请用以下调用替换strcpystrcat

strcpy_s(output, sizeof(output), "");

strcat_s(output, RESULT_SIZE, buffer);

删除冗余的空终止:

删除do-while循环:

buffer[bytesRead] = '\0';

因为strcat_s会解决这个问题。

答案 5 :(得分:0)

您可以使用

console.log

希望这对您有用