c++ - 如何使用CreateProcess在cmd中执行命令?

标签 c++ windows winapi command-prompt createprocess

我正在尝试通过我的 C++ 程序启动命令行,然后让 cmd 运行命令。我不确定我做错了什么。我查看了 MSDN 文档,但无法理解要在代码中更改哪些内容。

下面是我编写的代码块。我正在尝试启动 cmd,然后在 cmdArgs 中运行该命令。但是,在运行该程序时,它只是启动 cmd,而不运行其中的 nslookup 部分。我也尝试过其他命令,例如 ipconfig,但它们没有被执行。有人可以帮助我理解我做错了什么吗?

当我启动该程序时,它只是打开 cmd。我想做的是运行 cmdArgs 并在 cmd 屏幕上查看输出。

我是 C++ 新手,所以如果这是微不足道的,我深表歉意。我查看了网站上的其他问题,但 cmdArgs 的格式似乎是正确的 - 程序名称后跟 arg。

STARTUPINFO si; 
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

LPTSTR cmdPath = _T("C:\\Windows\\System32\\cmd.exe");
LPTSTR cmdArgs = _T("C:\\Windows\\System32\\cmd.exe nslookup myip.opendns.com. resolver1.opendns.com");


if (!CreateProcess(cmdPath, cmdArgs, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
    std::cout << "Create Process failed: " << GetLastError() << std::endl;
    return "Failed";
}

最佳答案

您的程序完全按照您的要求执行:您只需启动 cmd.exe 可执行文件即可。只需在控制台窗口中测试:

C:\Users\xxx>start /w cmd ipconfig

C:\Users\xxx>cmd ipconfig
Microsoft Windows [version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.

C:\Users\xxx>exit

C:\Users\xxx>

因此,cmd.exe ipconfig 只是推送了一个新的 cmd.exe,而不执行该行的其余部分。然后它等待来自其标准输入的命令。

您必须使用cmd.exe/c ipconfig要求新的cmd.exe执行命令,或cmd.exe/K ipconfig code> 如果您希望 cmd 在第一个命令后不退出:

C:\Users\serge.ballesta>cmd /c ipconfig

Configuration IP de Windows
...

所以你应该在代码中写入:

...
LPTSTR cmdArgs = _T("C:\\Windows\\System32\\cmd.exe /k nslookup myip.opendns.com. resolver1.opendns.com");
...

关于c++ - 如何使用CreateProcess在cmd中执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39702655/

相关文章:

c++ - dylib 中的重载运算符删除替换了 OSX 中的系统运算符

windows - Windows 7 上的 Microsoft Access 文本 ODBC 驱动程序

windows - 在 Windows 上的 Mercurial 中更改文件名的大小写

windows - 检测 "suspended"Windows 8/10 进程

c# - 使用 Windows API 从富文本控件检索文本的正确方法是什么?

c++ - 为什么 C++ 允许将指向基对象的指针转换为派生类的指针

c++ - std::is_constructible 为私有(private)构造函数返回不一致的值

c++ - recvfrom 只捕获发送到 255.255.255.255 的数据包

IIS 7.5 中的 PHP 崩溃(连接断开,连接被放弃)

c++ - Win API C++ 控制编辑必修