VC执行Cmd命令,并获取结果
VC执行Cmd命令,并获取结果
参考:https://blog.csdn.net/VonSdite/article/details/81295056
方法一:使用popen
#include <stdio.h> #include <string.h> // 描述:execmd函数执行命令,并将结果存储到result字符串数组中 // 参数:cmd表示要执行的命令, result是执行的结果存储的字符串数组 // 函数执行成功返回1,失败返回0 #pragma warning(disable:4996) int execmd(char* cmd, char* result) { char buffer[128]; //定义缓冲区 FILE* pipe = _popen(cmd, "r"); //打开管道,并执行命令 if (!pipe) return 0; //返回0表示运行失败 while (!feof(pipe)) { if (fgets(buffer, 128, pipe)) { //将管道输出到result中 strcat(result, buffer); } } _pclose(pipe); //关闭管道 return 1; //返回1表示运行成功 } int main(void) { char SystemInstallDate[] = "c:\\windows\\system32\\systeminfo|findstr 初始安装日期"; char PCserialnumber[] = "wmic bios get serialnumber"; char MACAddress[] = "ipconfig /all|findstr 物理地址"; char IPAddress[] = "ipconfig /all|findstr IPv4"; char MACIPAddress[] = "wmic nicconfig get IPAddress,MACAddress"; char HDserial[] = "wmic diskdrive get Caption,SerialNumber"; char res[1024] = { 0 }; execmd("wmic diskdrive get SerialNumber", res); }
方法二:使用Windows API CreatePipe
CreateProcess
#include <Windows.h> #include <string> std::string GetExeCmdResult(const wchar_t* pszCmd) { // 创建匿名管道 SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; HANDLE hRead, hWrite; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { return ""; } // 设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到hWrite) STARTUPINFO si = { sizeof(STARTUPINFO) }; GetStartupInfo(&si); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdError = hWrite; si.hStdOutput = hWrite; // 启动命令行 // 注意 CreateProcess 的第二个参数是 可修改的字符串指针(使用字符数组即可),不可以是字符串常量 PROCESS_INFORMATION pi; wchar_t szCmd[1024] = { 0 }; wcscpy_s(szCmd, 1024, pszCmd); if (!CreateProcessW(NULL, szCmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { return ("Cannot create process"); } // 立即关闭hWrite CloseHandle(hWrite); // 读取命令行返回值 std::string strRet; char buff[1024] = { 0 }; DWORD dwRead = 0; while (ReadFile(hRead, buff, 1024, &dwRead, NULL)) { strRet += std::string(buff, dwRead); } CloseHandle(hRead); return strRet; } int main(void) { char SystemInstallDate[] = "c:\\windows\\system32\\systeminfo|findstr 初始安装日期"; char PCserialnumber[] = "wmic bios get serialnumber"; char MACAddress[] = "ipconfig /all|findstr 物理地址"; char IPAddress[] = "ipconfig /all|findstr IPv4"; char MACIPAddress[] = "wmic nicconfig get IPAddress,MACAddress"; char HDserial[] = "wmic diskdrive get Caption,SerialNumber"; //char res[1024] = { 0 }; //execmd("wmic diskdrive get SerialNumber", res); std::string sRet = GetExeCmdResult(L"wmic diskdrive get SerialNumber"); }
-----------------------------
另外,只执行命令,或者说调用另一个进程exe
#include <Windows.h> #include <string> //------------------------------------------------ // 执行命令行 // 例如 ExeCmdLine(L"notepad.exe D:/BugReport.txt"); // ExeCmdLine(L"calc"); // ExeCmdLine(L"notepad"); // ExeCmdLine(L"ipconfig /all"); // ExeCmdLine(L"wmic diskdrive get SerialNumber"); // 注意:在控制台exe,执行该函数后会有cmd的窗口。在MFC exe 中,cmd的窗口会一闪而过。 //------------------------------------------------ bool ExeCmdLine(const wchar_t* pszCmd) { //STARTUPINFO si = { sizeof(si) }; //si.dwFlags = STARTF_USESHOWWINDOW; //si.wShowWindow = SW_SHOW; STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi = { 0 }; // 启动命令行 // 注意 CreateProcess 的第二个参数是 可修改的字符串指针(使用字符数组即可),不可以是字符串常量 例如:"notepad D:\\1.txt" wchar_t szCmd[1024] = { 0 }; wcscpy_s(szCmd, 1024, pszCmd); if (!CreateProcessW(NULL, szCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { //return ("Cannot create process"); return false; } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return true; }
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。