如何使用CreateProcess在cmd中执行命令?

时间:2016-09-26 12:20:28

标签: c++ windows winapi command-prompt createprocess

我试图通过我的c ++程序启动命令行,然后让cmd运行命令。我不确定我做错了什么。我查看了MSDN文档,但我无法理解代码中要更改的内容。

以下是我编写的代码块。我尝试启动cmd,然后在cmdArgs中运行该命令。但是,在运行程序时,它只是启动cmd而不运行它的nslookup部分。我已尝试过其他命令以及ipconfig,但它们没有被执行。有人可以帮助我理解我做错了什么。

当我启动程序时,它只会打开cmd。我尝试做的是让cmdArgs运行并在cmd屏幕上查看输出。

我是c ++的新手,所以如果这是微不足道的,我道歉。我已经查看了网站上的其他问题,但似乎cmdArgs的格式是正确的 - 程序名称后跟arg。

For Each row As DataRow In dt.Rows
    For Each row1 As DataRow In tmpdt.Rows
        If row("STATE").Tostring() = row1("STATE").Tostring() Then

        End If
    Next
Next

2 个答案:

答案 0 :(得分:1)

尝试使用此:

wchar_t command[] = L"nslookup myip.opendns.com. resolver1.opendns.com";

wchar_t cmd[MAX_PATH] ;
wchar_t cmdline[ MAX_PATH + 50 ];
swprintf_s( cmdline, L"%s /c %s", cmd, command );

STARTUPINFOW startInf;
memset( &startInf, 0, sizeof startInf );
startInf.cb = sizeof(startInf);

PROCESS_INFORMATION procInf;
memset( &procInf, 0, sizeof procInf );

BOOL b = CreateProcessW( NULL, cmdline, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startInf, &procInf );

DWORD dwErr = 0;
if( b ) 
{
    // Wait till process completes
    WaitForSingleObject( procInf.hProcess, INFINITE );
    // Check process’s exit code
    GetExitCodeProcess( procInf.hProcess, &dwErr );
    // Avoid memory leak by closing process handle
    CloseHandle( procInf.hProcess );
} 
else 
{
    dwErr = GetLastError();
}
if( dwErr ) 
{
    wprintf(_T(“Command failed. Error %d\n”),dwErr);
}

答案 1 :(得分:0)

您的程序完全按照您的要求执行:您只需启动cmd.exe可执行文件。只需在控制台窗口中测试:

C:\Users\xxx>start /w cmd ipconfig

C:\Users\xxx>cmd ipconfig
Microsoft Windows [version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.

C:\Users\xxx>exit

C:\Users\xxx>

所以cmd.exe ipconfig只是推了一个新的cmd.exe而没有执行剩余的行。然后等待来自其标准输入的命令。

您必须使用cmd.exe /c ipconfig让新cmd.exe执行命令,或cmd.exe /K ipconfig如果您希望cmd在第一个命令后不退出:

C:\Users\serge.ballesta>cmd /c ipconfig

Configuration IP de Windows
...

所以你应该写下你的代码:

...
LPTSTR cmdArgs = _T("C:\\Windows\\System32\\cmd.exe /k nslookup myip.opendns.com. resolver1.opendns.com");
...