我有一个批处理脚本,它在基于 Windows 的 Jenkins 节点上运行(意味着无头,不涉及 [GUI] 窗口)批处理脚本的标准输入已通过 禁用< NUL
,以避免出现“终止批处理作业(Y/N)”提示。
批处理脚本执行一些准备工作,最终调用在 Cygwin 或 MSYS2(取决于节点)中运行的 Bash 脚本。从那里创建了许多新进程,调用了其他 Bash 脚本,调用了其他批处理脚本等。
问题:有没有办法,从命令行——即cmd.exe
——创建作业对象“聚集”初始批处理脚本创建的进程以及随后由这些脚本创建的进程......?
这里的目标是强制拆除作业中的所有进程 - 就像作业中的进程超出资源配额时所做的那样 - 一旦初始脚本终止(无论哪种方式!)。
或者:如果cmd.exe
太有限,那么“标准” Windows 10/11 安装中还有哪些其他实用程序可以实现这一点?
PS:Microsoft/Sysinternals 的 Process Explorer 有一项名为“Kill Process Tree”的功能。这大概就是我需要的。唉,无论如何,“进程树”都不是一种可靠的机制。它依赖于子进程内部匹配的父进程 PID,而且根本无法保证父进程比子进程活得更久,而且语义也与 Unix 有很大不同。
答案1
从 CMD,您可以使用命令title
重命名该窗口的标题。
例如,您可以按如下方式设置标题:title kill me later
您可能希望对生成的每个进程都执行此操作。您可以创建一个批处理文件,首先更改标题,然后根据需要启动另一个程序。
稍后在批处理脚本中,您现在可以用以下命令查询这些窗口:
tasklist /FI "WINDOWTITLE eq kill me later"
如果你喜欢你所看到的内容,你可以使用以下命令终止它:
taskkill /FI "WINDOWTITLE eq kill me later" /F
这将关闭所有带有标题的窗口kill me later
开关/f
将强制关闭窗口。省略此参数将尝试关闭它,但可能会提示您是否要关闭窗口。
请注意,cmd 无法通过这种方式自行关闭。它只是找不到窗口。
此外,如果您使用 Windows 终端,并且在其中生成一个 CMD 实例,则使用此方法不仅会关闭该 CMD 实例,而且还会关闭整个 Windows 终端实例。
答案2
一个简单的方法是创建一个专门用于该任务的用户帐户。
然后可以以 RunAs 此用户帐户启动初始批处理脚本,这意味着所有后续子任务也将在同一用户帐户下运行。
然后可以通过以下方式终止所有任务:
taskkill /f /fi "USERNAME eq user-account-name"
此命令可能需要以管理员权限运行。