因工作需要开发了一个循环杀死服务的脚本,该脚本执行后会将自己的进程id写到一个文本文件中,在必要的时候需要另一个脚本来杀死该脚本的运行。
循环杀死服务的脚本演示了如何获取脚本执行的进程id以及windows批处理脚本中毫秒级延时。
@echo on
rem 获取脚本执行的进程id
wmic process where name="wmic.exe" get parentprocessid > C:\stopMyServiceBatPid.txt
set n=0
:abc
set /a n+=1
sc config MessageManagerService start= disabled
taskkill /fi "Services eq MessageManagerService" /F
rem 秒级延时
rem ping -n 2 127.0.0.1>nul
rem 毫秒级延时
powershell -nop -c "& {sleep -m 10}"
if %n%==6000 exit
goto abc
杀死循环杀死服务的脚本演示了逐行读取文本文档,其中for循环读取文本文件('type C:\dbAgent\stopNpfBatPid.txt')中没有type则无法读取由脚本生成的文本文件。for循环内部自增变量必须设置setlocal enabledelayedexpansion,否则循环内部的自增变量的值不会变,同时在内部使用的时候必须用两个!号来获取变量的值,否则变量的值不会更新。
@echo off
rem 必须设置enabledelayedexpansion,否则循环内部自增变量的值不会变
setlocal enabledelayedexpansion
set /a n=0
for /f "delims=" %%a in ('type C:\stopMyServiceBatPid.txt') do (
echo %%a
set /a n+=1
rem echo !n!
rem 在bat中只能通过两个!来正确获取自增变量n的值
if !n!==2 taskkill /f /pid %%a
)