如何使用 CreateProcess 在 cmd 中执行命令?
How to execute a command in cmd using CreateProcess?
我正在尝试通过我的 C++ 程序启动命令行,然后使用 cmd 运行 命令。我不确定我做错了什么。我查看了 MSDN 文档,但无法理解要更改我的代码的内容。
下面是我写的代码块。我正在尝试启动 cmd,然后 运行 cmdArgs 中的命令。但是,在 运行 启动程序时,它只是启动 cmd 而没有 运行 启动它的 nslookup 部分。我试过使用其他命令以及 ipconfig,但它们没有被执行。谁能帮我理解我做错了什么。
当我启动程序时,它只会打开 cmd。我想要做的是使用 cmdArgs 运行s 并在 cmd 屏幕上查看输出。
我是 C++ 的新手,所以如果这是微不足道的,我深表歉意。我查看了网站上的其他问题,但 cmdArgs 的格式似乎是正确的 - 程序名称后跟 arg。
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
LPTSTR cmdPath = _T("C:\Windows\System32\cmd.exe");
LPTSTR cmdArgs = _T("C:\Windows\System32\cmd.exe nslookup myip.opendns.com. resolver1.opendns.com");
if (!CreateProcess(cmdPath, cmdArgs, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
std::cout << "Create Process failed: " << GetLastError() << std::endl;
return "Failed";
}
您的程序完全按照您的要求执行:您只需启动 cmd.exe 可执行文件。只需在控制台中测试 windows:
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");
...
试试这个:
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);
}
我正在尝试通过我的 C++ 程序启动命令行,然后使用 cmd 运行 命令。我不确定我做错了什么。我查看了 MSDN 文档,但无法理解要更改我的代码的内容。
下面是我写的代码块。我正在尝试启动 cmd,然后 运行 cmdArgs 中的命令。但是,在 运行 启动程序时,它只是启动 cmd 而没有 运行 启动它的 nslookup 部分。我试过使用其他命令以及 ipconfig,但它们没有被执行。谁能帮我理解我做错了什么。
当我启动程序时,它只会打开 cmd。我想要做的是使用 cmdArgs 运行s 并在 cmd 屏幕上查看输出。
我是 C++ 的新手,所以如果这是微不足道的,我深表歉意。我查看了网站上的其他问题,但 cmdArgs 的格式似乎是正确的 - 程序名称后跟 arg。
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
LPTSTR cmdPath = _T("C:\Windows\System32\cmd.exe");
LPTSTR cmdArgs = _T("C:\Windows\System32\cmd.exe nslookup myip.opendns.com. resolver1.opendns.com");
if (!CreateProcess(cmdPath, cmdArgs, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
std::cout << "Create Process failed: " << GetLastError() << std::endl;
return "Failed";
}
您的程序完全按照您的要求执行:您只需启动 cmd.exe 可执行文件。只需在控制台中测试 windows:
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");
...
试试这个:
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);
}