我有一个工作的命令行应用程序,它使用Windows API在新的控制台窗口中创build一个subprocess。 我正在使用CREATE_NEW_CONSOLE
标志,但我需要一种方法来保持新的打开的窗口closures,当新的进程退出。
这里是现有的代码:
STARTUPINFO si; LPCTSTR lpAppName = "\\\\fs\\storage\\QA\\Mason\\psexec\\PSExec.exe"; string lpstr = "\\\\fs\\storage\\QA\\Mason\\psexec\\PSExec.exe \\\\" + target + " /accepteula -u user -p pass -s -realtime \\\\fs\\storage\\QA\\Mason\\psexec\\RI.bat"; LPTSTR lpCmd = CA2T(lpstr.c_str()); PROCESS_INFORMATION pi; // This structure has process id DWORD exitCode = 9999; // Process exit code ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); // Start the child process. if (!CreateProcess(lpAppName, // cmd.exe for running batch scripts lpCmd, // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE CREATE_NEW_CONSOLE, // New Console Window creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi) // Pointer to PROCESS_INFORMATION structure ) { cout << "CreateProcess failed: " << GetLastError() << endl; getchar(); return -1; } // Wait until child process exits. cout << "Waiting Installation processes to complete on " << target << endl; DWORD result = WaitForSingleObject(pi.hProcess, INFINITE); // Get Exit Code if (!GetExitCodeProcess(pi.hProcess, &exitCode)) { cout << "GetErrorCodeProcess failed: " << GetLastError() << endl; return -1; } // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
我怎样才能使新的控制台窗口保持打开状态?
在这个特定的情况下,最简单的解决方案是作弊,即,
psexec -s \\target cmd /c "\\server\share\file.bat & pause"
您已经隐式启动了cmd.exe
实例来运行批处理文件,所以这不会引起任何重大的开销。
对于更一般的解决方案,您需要启动一个启动目标应用程序( 不带CREATE_NEW_CONSOLE
)的代理应用程序(使用CREATE_NEW_CONSOLE
),然后等待。 对于奖励积分,代理应用程序将与父应用程序相同,只是用一个命令行标志启动,告诉它该做什么。