• 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);
    }
    View Code

    方法二:使用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");
    }
    View Code

    -----------------------------

    另外,只执行命令,或者说调用另一个进程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;
    }
    View Code

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    k8s keepalived haproxy 集群成功
    .Net Core 用 EntityFramework 读取 Oracle
    Fedora CoreOS 安装 非LInux专业国内第一手
    Docker 下的 Keepalived + Haproxy 高可用实现 1 实现结果演示
    第二篇 windows container 微软的原生容器
    第一篇 Windows docker 概述
    测试openLiveWrite写博客
    比特币勒索病毒肆虐,腾讯云安全专家给你支招
    WannaCry 勒索病毒用户处置指南
    pytorch 学习笔记之编写 C 扩展,又涨姿势了
  • 原文地址:https://www.cnblogs.com/htj10/p/13830785.html
Copyright © 2020-2023  润新知