【问题标题】:How to stop currently running process in cmd without stopping the batch execution?如何在不停止批处理执行的情况下停止 cmd 中当前正在运行的进程?
【发布时间】:2017-12-18 08:01:46
【问题描述】:

我有一个运行另一个进程的循环批处理文件。

如果一个进程抛出错误,它基本上会自行重启。

这是简短的版本:

:start
C:\Squid\bin\squid.exe
timeout 1
goto start

上面代码的问题是,有时候我需要强制重启当前正在运行的进程。

现在,如果我按 ctrl+c,它实际上会终止批处理本身并关闭窗口,这不是我想要的......

我本可以使用 taskkill 命令编写另一个批处理文件,但我不能,因为这个进程的许多实例具有不同的进程 ID。

感谢您的帮助!

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:

    其实我可以使用start /wait命令,和上面一样,它会等待文件执行但会在不同的窗口中打开它,我可以很容易地关闭并强制在不终止我的批处理的情况下重新启动程序。

    :start
    start /wait C:\Squid\bin\squid.exe
    timeout 1
    goto start
    

    注意:关闭批处理后可能会提示终止执行。我在这里找到了处理方法:https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation

    rem Bypass "Terminate Batch Job" prompt.
    if "%~1"=="-FIXED_CTRL_C" (
       REM Remove the -FIXED_CTRL_C parameter
       SHIFT
    ) ELSE (
       REM Run the batch with <NUL and -FIXED_CTRL_C
       CALL <NUL %0 -FIXED_CTRL_C %*
       GOTO :EOF
    )
    

    【讨论】:

    • 如果您控制 squid.exe 的源,请注册控制台控制处理程序或 C SIGBREAK 处理程序。然后当用户关闭控制台时,squid.exe 有 5 秒的时间处理事件以正常退出代码正常退出,而不是通过STATUS_CONTROL_C_EXIT 异常退出。
    • 虽然文档没有明确要求,但强烈建议始终提供标题参数作为第一个参数作为未记录的行为可能会导致它吞下其他参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多