【问题标题】:how to kill a cmd process without killing others cmds?如何在不杀死其他 cmds 的情况下杀死一个 cmd 进程?
【发布时间】:2018-08-01 16:02:32
【问题描述】:

我正在处理一个批处理文件,该文件应该启动一个进程 (CMD),然后它应该在完成后终止该进程。问题是,Imagename 是 cmd.exe,另一个问题是它应该在 Jenkins 上运行。 这是我测试过的:

  • 使用窗口名称通过 wmic 获取 PID 以查找进程 -> Jenkins 失败
  • Taskkill 通过命名窗口-> 失败,因为 Jenkins 没有 由于安全问题而显示窗口。
  • Taskkill by imagename -> 失败,因为有其他 cmd 进程 同时运行
  • Taskkill 使用 pid 但 pid 来自最后一个 cmd 启动。 - 工作,但它是 不是很安全。

我无法理解 wmic 的工作原理,但正如我所见,我无法使用 START 命令之类的命令启动进程。

条件:

  • 一段时间后无法杀死它,因为我需要从 合并工具,有时合并工具可能需要很长时间。

  • 它应该与其他 (cmd) 进程同时运行 // Jenkins

我的问题,有没有办法从 START 命令中获取 PID?

这里有一些对我有很大帮助的问题! Windows batch file : PID of last process? Compare number of a specific process to a number

代码:

set "console_name=cmd.exe"
set "git_command=%gitcmd% mergetool ^>output.txt"
tasklist /FI "imagename eq %console_name%" /NH /FO csv > task-before.txt
START "mergetool_w" CMD /c %git_command%
tasklist /FI "imagename eq %console_name%" /NH /FO csv > task-after.txt
for /f "delims=, tokens=2,*" %%A in ('fc /L /LB1  task-before.txt task-after.txt') do set pid=%%A
pid=!pid:"=!
echo pid is %pid%
TASKKILL /t /pid %pid% /f

【问题讨论】:

    标签: windows git batch-file jenkins


    【解决方案1】:

    您实际上可以使用findstr 来检查在您的start 命令行之后添加了哪些任务,这取决于您的文件task-before.txttask-after.txt

    findstr /LXVG:task-before.txt task-after.txt
    

    由于nasty bug,这在某些情况下可能会导致意外输出。为防止这种情况,请添加 /I 选项,如果您可以接受不区分大小写的搜索:

    findstr /ILXVG:task-before.txt task-after.txt
    

    【讨论】:

      【解决方案2】:

      是的,很有可能。我将在此处的另一篇文章中从我以前的 awnser 中获取代码:Stop Execution of Batch File after 20 Seconds and move to Next

      我想首先假设“mergetool_w”是您使用 start...的 CMD 的名称...

      您想要解决此问题的方法是在tasklist 中搜索您的控制台title,然后将PID# 从上下文中提取出来。 find 后缀可用于“过滤”结果以及 tokens=2 以仅提取 PID#

      FOR /F "tokens=2" %%# in ('tasklist /v ^| find "mergetool_w"') do set PID=%%#
      

      从那里,您现在可以使用taskkill /pid 命令终止这个新窗口。 PID# 存储在字符串 %PID% 中,因此命令很简单:

      taskkill /pid %PID% /t /f
      

      最后,您似乎正在尝试“记录”数据,因此请随时将> text-task.txt 放在需要的地方。

      【讨论】:

      • 我无法检查/测试,但我假设因为Find 命令也使用字符串mergetool_w,因此它是否会在@987654336 中匹配自身@ 输出并可能返回不正确的 PID? 据我了解,For 括号内的命令在单独的 cmd.exe 实例中运行,该实例将显示在 TaskList finding mergetool_wConsole
      • @Compo 否,此命令将查找任何名为 mergetool_w 的控制台,并将其命名为 PID。试一试,制作一个基本的批处理文件并使用Title 命令和pause。当然,如果两个控制台命名相同,您可能会遇到一些问题,因为您会得到两个结果。
      • 我说我无法检查或测试,因为我很少使用计算机,尤其是 Windows 计算机。我接受你对我问题的回答;在这样做时,我假设 /Verbose 输出 Window Title 而不是 Command Line
      • @Compo 这是正确的,但是^| find "Console" 不需要这样做,但不会损害结果。我将编辑我的回复。
      • 嗨约翰,我测试了你建议的方式,但不幸的是,詹金斯不显示窗口,并且永远不会检索到名称,这就是我搜索不同解决方案的原因。但我理解你的做法。然而,在@aschipfl 的帮助下,我的脚本现在可以满足我的需求了。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多