文章大纲

利用bat脚本判断Windows系统里服务是否运行,并同时启动或停止服务

2023年08月04日 20:22

需求场景

今天想通过go脚本开启一个定时任务,每30秒去检测Windows系统里target.exe文件是否有执行,如果没有执行,就将它启动起来


bat脚本分析

然后一行一行代码的调试,总算写出了满足要求的bat脚本。



相同的坑,以前也踩了很多遍,但一直没有记录下来,今天又继续踩了一遍。


现在对照上面bat脚本,说说语法应该要注意的地方。

1. 设置变量,等号=两边不要有空格。

如图,否则会报不识别isExist这个命令的错误


2. tokens是用来定点提取数据的。

例如,用tasklist命令查看进程,结果格式如下:

>>tasklist | findstr "lems"
test64-lems-collect.exe      51908 Console                    1     10,776 K

没有2这部分,a变量就只能接收到第一列的值,即test64-lems-collect.exe这个字符串。

有2这部分,a变量仍然是接收第一列的值,b变量会接收*代表的内容,即除了第一列外的内容。

将两个变量内容echo出来如下:

test64-lems-collect.exe
51908 Console                    1     13,156 K


关于token的更详细用户,请参考此篇文章:(日后学习补上)


3. NH,可理解为no header,即不显示栏目标题。

如果去掉3这部分,查出服务的结果如下所示:

>>tasklist /FI "imagename eq test64-lems-collect.exe"




4. 脚本命名不要过长。

这里我踩了一个坑,就是如果这个服务脚本命名长了,查询服务时,第一列显示会被截断。

我一开始脚本明名为“test-lems collect-64-no window.exe”,但是进程里window被截断,如下:


所以就导致第5处的if判断怎么都走不通,继而影响脚本知道服务是否已经运行。


5. %%a两边要带双引号

关于bat里变量的用法,我也是懵得很,先暂且记住吧。


6. start命令的用法

如果脚本命名有空格,就如图所示,后面要先加一个双引号,说是起个别名,没啥太大意义,但不可缺少。脚本也需要双引号包起来;

如果脚本命名无空格,脚本命名就不需要双引号包起来,后面也不需要空双引号。

例如如下,两种方式皆可:

start "" "test64-lems-collect.exe"
start test64-lems-collect.exe


脚本命名有空格,bat脚本写起来确实更麻烦,所以我就干脆全部用破折号了。


本文为翟码农个人博客蓝翟红尘里Windows分类下的有关bat脚本实现进程自启动的原创文章,转载请注明出处:


bat脚本源代码:

@echo off
set isExist=no
for /F "tokens=1*" %%a in ('tasklist /FI "imagename eq test64-lems-collect.exe"') do (
		echo %%a
		echo %%b
	 	if "%%a" == "test64-lems-collect.exe" (
	 		set isExist=yes
	 	) 
	) 
echo "script exist?"
echo %isExist%
if %isExist% == yes (
	goto end
)
	
C:
cd "C:\lems_collect_script\" 
start "" "test64-lems-collect.exe"
:end
pause

脚本里没有关闭进程的代码,关闭进程直接用taskkill命令就好了,如下:

taskkill /IM "test64-lems-collect.exe" /F

/IM表示根据进程名称即imagename来杀进程,/F即force,表示强制执行。



  • 2023年08月04日 19:20文章创建
  • 2023年08月04日 20:22文章发布
我要评论
评论列表
暂无评论,期待你的评论哦!
回到顶部