1. 苏葳的备忘录首页
  2. 操作系统

Windows中启动停止脚本及tasklist,taskkill,start,wmic的用法

cmd tasklist taskkill用C#写过几个调用tuxedo的命令行程序用作数据库之间的转发,主程序只有两个,用传入的命令行参数实现多种报文的转入转出。最近需在多台机器之间部署应用,自然不能在桌面上启动一大堆黑窗口,得仿照unix下做成启动停止脚本。

unix下的启停脚本编写相当方便,可在windows 下却遇到一些麻烦。

首先考虑的自然是tasklist和taskkill命令。

tasklist /v可显示运行进程的详细信息 /fo指定输出格式,有table,list,csv可选,/fi指定过滤器,/s可显示远程机器的进程等。但是在其中却无显示运行进程命令行参数的选项。

taskkill也有相应的一些命令参数,但仍无用命令行参数判定的选项。

TASKKILL /S system /F /IM notepad.exe /T
TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
TASKKILL /F /IM notepad.exe /IM mspaint.exe
TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM *
TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"

由于启动程序均为同一进程名,所以必须以命令行参数作相应区别。start 命令可加”title”参数作为窗口标题启动进程的,task*命令能识别窗口标题,能否用指定的窗口标题区分呢?但因为不希望开太多窗口在桌面上,所以会用start /b 程序 参数名来启动进程。在此种无窗口的情况下,tasklist和taskkill的窗口名参数也失去作用。且即使对每个启动命令行做个批处理,再用start启动此批处理文件以保留每进程的命令窗口也是不行的。因为用start直接启动程序命令行会启动一个进程,但若对命令行加层bat包装,则启动的是两个进程(cmd.exe进程和真实应用进程),命令行参数也仅能表现在bat的cmd窗口标题上而非应用进程上,若kill掉应用进程,应用进程终止,相应的cmd窗口也一并消失。但若依窗口标题查找并kill掉cmd窗口,则其下的应用进程仍会运行。所以走task命令族的方法看来是行不通。

后在发现wmic命令,功能相当强大,如

wmic process where name="svchost.exe" get caption,name,commandline /value

可获取所有svchost.exe进程的caption和name及命令行参数信息。若能获得进程id,则离成功就前进了一大步。尝试加入pid参数,提示无效,会不会此处不能获取进程id?那就彻底悲剧了。查资料后发现原来是processid,这下获取参数的问题解决了。下面自然可以用taskkill /f /pid 进程id的方法杀掉进程了。

然而有点小麻烦,由于wmic的输出是多行,所以取出对应命令行参数并获得进程id在批处理中有相当麻烦的处理过程。然而wmic自身可以轻易的完成此种杀手工作。以用start /b ping.exe 192.168.1.107 -t为例,wmic process where “commandline like ‘ping%'” call terminate即可杀掉所有命令行中以ping起头的进程,wql语法支持通配符使其更加强大。

问题解决,最后附带一个windows 中延时的小脚本,可实现unix中sleep的功能

Wscript.Sleep Wscript.Arguments(0) * 1000

自然调用时需加以秒为单位的一个参数。

此命令的调用仍然会打开cmd窗口,若以start /b 形式调用此vbs脚 本以隐藏窗口,则需加/w 参数,即start /b /w aaaa.vbs 10的形式。若不加/w 由于/b参数的作用,执行后会立即执行下一条命令而起不到延时的效果。

另:实际在脚本中写上述wmic命令时发现失败,原因是wql语句中”name like ‘ping%'”处,%号应该写成%%,否则会被批处理脚本自动转换。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/345.html

发表评论

您的电子邮箱地址不会被公开。