Cmd命令获取结果

编程入门 行业动态 更新时间:2024-10-15 00:19:07

Cmd<a href=https://www.elefans.com/category/jswz/34/1771323.html style=命令获取结果"/>

Cmd命令获取结果

VC执行Cmd命令,并获取结果

方法一:使用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");}// 立即关闭hWriteCloseHandle(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;
}

更多推荐

Cmd命令获取结果

本文发布于:2023-12-03 16:45:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1656723.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:命令   Cmd

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!