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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM