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个字符