如何退出正在运行的批处理?

时间:2019-05-16 21:46:16

标签: c windows batch-file winapi

考虑以下程序:

main(){system("start /b batch.bat");}

我想稍后在程序中终止该批处理以及该批处理产生的任何进程-有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我想终止该批处理以及该批处理产生的任何进程

为此存在Job Objects

  

作业对象允许将进程组作为一个单元进行管理。

     

要终止当前与作业对象关联的所有进程,请使用   TerminateJobObject函数。

if (HANDLE hJob = CreateJobObjectW(0, 0))
{
    WCHAR ApplicationName[MAX_PATH];
    if (GetEnvironmentVariableW(L"ComSpec", ApplicationName, RTL_NUMBER_OF(ApplicationName)))
    {
        PROCESS_INFORMATION pi;
        STARTUPINFOW si = { sizeof(si) };
        if (CreateProcessW(ApplicationName, L"cmd /c <some path>/batch.bat", 
                0, 0, 0, CREATE_SUSPENDED, 0, 0, &si, &pi))
        {
            if (AssignProcessToJobObject(hJob, pi.hProcess))
            {
                ResumeThread(pi.hThread);
            }
            else
            {
                TerminateProcess(pi.hProcess, 0);
            }
            CloseHandle(pi.hThread);
            CloseHandle(pi.hProcess);
        }
    }

    // .. wait for something ...
    TerminateJobObject(hJob, 0);
    CloseHandle(hJob);
}

无论如何,可以通过远程com调用(例如StartService)启动新的程序-正式地是从另一个过程启动的。这当然不会工作,也不会终止