Bat再次小试

《Bat小试牛刀》之后,今天又需要一个小的bat文件。需求是这样的,有一个windows服务(服务名:xxxx,进程映像名:xxxx.exe)被数据库拖慢了,但目前又没时间调整代码,所以打算定时重启,此需求看似不合理,实则比较无奈。

然而这个windows服务有很多子进程,通过net stop杀不死子进程或者杀的不及时,所以打算使用taskkill命令,所以我的bat文件是这样:

@echo off
taskkill /f /t /im xxxx.exe
net start xxxx

但由于taskkill和net start 操作间隔太近,导致服务没能成功重启,提示:

请求的服务已经启动。

因此故技重施,修改如下:

@echo off
taskkill /f /t /im xxxx.exe
ping -n 3 127.1>nul
net start xxxx

这样就好使了,但悲催的事情又来了,居然发现了两个进程映像名都是xxxx.exe的,上面的bat杀掉了两个进程:

成功: 已终止进程 "xxxx.exe",其 PID 为 6872。
成功: 已终止进程 "xxxx.exe",其 PID 为 10784。

好在taskkill提供了筛选器FI:

 筛选器名      有效运算符                有效值
 -----------   ---------------           -------------------------
 STATUS        eq, ne                    RUNNING |
                                         NOT RESPONDING | UNKNOWN
 IMAGENAME     eq, ne                    映像名称
 PID           eq, ne, gt, lt, ge, le    PID 值
 SESSION       eq, ne, gt, lt, ge, le    会话编号。
 CPUTIME       eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                         hh:mm:ss。
                                         hh - 时,
                                         mm - 分,ss - 秒
 MEMUSAGE      eq, ne, gt, lt, ge, le    内存使用量,单位为 KB
 USERNAME      eq, ne                    用户名,格式为 [domain\]user
 MODULES       eq, ne                    DLL 名称
 SERVICES      eq, ne                    服务名称
 WINDOWTITLE   eq, ne                    窗口标题

于是修改bat如下:

@echo off
taskkill /f /t /fi "SERVICES eq xxxx"
ping -n 3 127.1>nul
net start xxxx

这下完全符合要求了^_^,然后利用windows自带的“任务计划”功能做个定时任务(使用NT AUTHORITY\SYSTEM运行,可以不用密码)。

但如果再加一个日志就更完美了,于是乎:

@echo off
set logfile=d:\log.txt
echo %date% %time% >> %logfile%
taskkill /f /t /fi "SERVICES eq xxxx" >> %logfile%
ping -n 3 127.1>nul
net start xxxx >> %logfile%

PS:
预定义的变量

下面是些已经被底层定义好可以直接使用的变量:不会出现在 SET 显示的变量列表中
%CD% - 扩展到当前目录字符串。
%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。
%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
%0 bat的完整路径名如"C:\Windows\system32\xxx.bat"
%1 bat参数1依次类推%2参数2...
%path% - 当前的环境变量。以分号隔开的路径列表,路径可包含空格,可以以'\'结尾, 可以以双引号包围之。


扩展变量

@ 与%i相关的变量(bat参数或者for循环的%i)
假设文件为C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%0        C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%~dp0  C:\Documents and Settings\jinsun\桌面\
%cd%   C:\Documents and Settings\jinsun\桌面
%~nx0   ParseSinglePkgs.bat
%~n0     ParseSinglePkgs
%~x0     .bat

@ 与%VAR%相关的变量
%VAR:str1=str2%   会将VAR中的str1替换为str2(str2如果为空则可以达到删除的效果,str1前可以加*,变量%ABC:*B=%是C)
%VAR:~0,-2%          会提取VAR 变量的所有字符,除了最后两个
%VAR:~2%              会提取VAR 变量的除前两个的所有字符
%VAR:~-2%             会提取VAR 变量的最后两个
%VAR:~2,5%           提取从第2个字符开始的5个字符

posted @ 2014-08-12 18:28  码农神说  阅读(206)  评论(0编辑  收藏  举报