📜  运行 cmd 命令 c++ (1)

📅  最后修改于: 2023-12-03 15:12:19.185000             🧑  作者: Mango

运行cmd命令 - C++

在编写 C++ 程序时,常常需要与 cmd 命令交互,例如执行系统命令、获取命令行参数、输出数据到控制台等。本文将介绍如何在 C++ 中运行 cmd 命令。

方法一:使用 system 函数

system 函数可以在 C++ 程序中运行任意系统命令,其原型为:

int system(const char* command);

其中,command 参数为要执行的命令字符串。例如,要在 cmd 中执行 dir 命令,并输出结果到控制台,可以写出如下代码:

#include <iostream>
#include <cstdlib>
using namespace std;
int main () {
    system("dir");
    return 0;
}

上述代码中,system 函数的返回值为执行 cmd 命令的结果。在 Windows 中,其返回值为命令执行后的返回值,通常为 0 表示执行成功。如果执行 cmd 命令时需要传入参数,只需将命令字符串组合好即可。

需要注意的是,由于 system 函数相当于在 C++ 程序中调用了 cmd 命令,因此存在一定的安全风险。尤其是在处理用户输入时,应该对输入内容进行过滤和验证,以避免系统命令被恶意注入。

方法二:使用 popen 函数

popen 函数可以创建一个管道,使 C++ 程序可以与 cmd 命令进行交互。其原型为:

FILE* popen(const char* command, const char* mode);

其中,command 参数为要执行的命令字符串,mode 参数为打开管道的模式,一般为 "r" 或 "w"。例如,要在 cmd 中执行 dir 命令,并读取输出结果,可以写出如下代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main () {
    FILE *fp = popen("dir", "r");
    char buffer[1024];
    while (fgets(buffer, 1024, fp)) {
        cout << buffer;
    }
    pclose(fp);
    return 0;
}

上述代码中,popen 函数返回的是一个 FILE 指针,可以像操作文件一样使用 fgets 函数读取输出结果。pclose 函数用于关闭管道。需要注意的是,popen 函数返回的 FILE 指针只能读写一个方向,如果要进行双向交互,需要同时打开两个管道。

方法三:使用 CreateProcess 函数

CreateProcess 函数可以创建一个新的进程,并执行指定命令,其原型为:

BOOL CreateProcess(
    LPCTSTR lpApplicationName,
    LPTSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCTSTR lpCurrentDirectory,
    LPSTARTUPINFO lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
);

其中,lpCommandLine 参数为要执行的命令字符串。例如,要在 cmd 中执行 dir 命令,并读取输出结果,可以写出如下代码:

#include <iostream>
#include <windows.h>
using namespace std;
int main () {
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;
    CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
    SetHandleInformation(hReadPipe, HANDLE_FLAG_INHERIT, 0);
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.hStdError = hWritePipe;
    si.hStdOutput = hWritePipe;
    si.dwFlags |= STARTF_USESTDHANDLES;
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    CreateProcess(NULL, "cmd /c dir", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    CloseHandle(hWritePipe);
    WaitForSingleObject(pi.hProcess, INFINITE);
    char buffer[1024];
    DWORD bytesRead;
    while (ReadFile(hReadPipe, buffer, 1024, &bytesRead, NULL)) {
        if (bytesRead == 0) break;
        buffer[bytesRead] = '\0';
        cout << buffer;
    }
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hReadPipe);
    return 0;
}

上述代码中,使用 CreatePipe 函数创建进程间通信管道,并将标准输出和标准错误输出都重定向到管道中,然后通过 CreateProcess 函数创建一个新的 cmd 进程并执行命令。通过 ReadFile 函数读取管道输出,并输出到控制台中。最后需要关闭相关句柄。

需要注意的是,CreateProcess 函数可以指定一系列参数来精细控制进程的创建和执行,详细参数可以查看官方文档

小结

本文介绍了三种在 C++ 程序中运行 cmd 命令的方法,包括使用 system 函数、popen 函数和 CreateProcess 函数。这些方法可以方便地实现与操作系统交互和控制台程序的调用。在使用这些方法时需要注意安全性和效率问题,避免恶意攻击和程序崩溃。