今天想通过go脚本开启一个定时任务,每30秒去检测Windows系统里target.exe文件是否有执行,如果没有执行,就将它启动起来
然后一行一行代码的调试,总算写出了满足要求的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脚本实现进程自启动的原创文章,转载请注明出处:
@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,表示强制执行。