2013-12-13 219 views
2

我组建了一个批处理文件,该文件执行以下操作打开单独的CMD窗口:批处理文件 - 关闭通过批处理文件过程

  1. 开始Selenium测试中心
  2. 开始Selenium测试节点
  3. 运行Selenium测试脚本
  4. 打开测试结果xml文档。
  5. 关闭硒枢纽和节点

硒枢纽和节点通过使用START命令,使他们在自己开CMD窗口调用2个批处理文件打开。我对我的流程很满意,直到第5)点,关闭包含集线器和节点的两个cmd窗口。

我知道你可以关闭所有的“cmd.exe”进程,但这似乎是很多钝器的方法。是否有一种方法可以识别或保留由我的批处理脚本打开的集线器和节点cmd窗口的句柄,以便我可以仅关闭这两个句柄?

谢谢。

回答

1

作为替代,以精彩的npocmaka答案,如果您知道或可以设置已启动的Selenium窗口的标题,可以使用此信息检索并过滤具有这些标题的任务列表。

当输出到控制台是正确的,从TASKKILL行删除echo命令

@echo off 

    rem Prepare environment 
    setlocal enableextensions 

    rem Configure list of window titles 
    set titles="seleniumHUB" "seleniumNODE" 

    rem For each title in title list 
    for %%t in (%titles%) do (

     rem Get the list of task with the indicated window title. 
     rem The list is get from tasklist, in verbose mode and in csv format 
     rem The last column in the list is the window title 
     for /f "tokens=1,2 delims=," %%a in (
      'tasklist /fi "imagename eq cmd.exe" /v /fo csv ^| findstr /i /r /c:"%%~t[^,]*$"' 
     ) do (
      echo taskkill /pid %%~b 
     ) 
    ) 

    rem Clean 
    endlocal 
+0

aaw yes.'Title'.Simple and neat。+ 1 – npocmaka

+0

这对我来说非常合适,解决了我在npocmaka的解决方案中提到的问题,该解决方案最初似乎达到了我想要的效果。将您的答案MC提升至已接受的答案。 – DaftMule

1

尝试这样:

@echo off 

for /f "tokens=2 delims=;= " %%a in ('wmic process call create "cmd.exe /c C:\selenium.bat"^,"c:\workdir" ^| find "ProcessId"') do (
    set "cmd_pid=%%a" 
) 

taskkill /PID %cmd_pid% /f 

wmic process call create "cmd.exe /c C:\selenium.bat"就可以启动一个进程,并得到其PID,当你杀了它,你可以使用taskkill /PID %cmd_pid% /f

+0

非常感谢!在批处理脚本编写方面,我是一个小菜鸟,所以仍然通过这个不同的元素来工作,但是到目前为止,我已经发现了很好的工作。 – DaftMule

+0

您可以使用'PSlist -t'来检测子进程,但是您需要从sysinternals.Later下载它。我将创建一个脚本。 – npocmaka

+0

实际上,在进一步测试之后,这个想法不幸留下了一个conhost.exe和相关的selenium javaw.exe进程,因为每个硒cmd窗口都处于活动状态,尽管cdm.exe进程已被终止。 – DaftMule