Board logo

标题: [文本处理] [已解决]如何禁止批处理自身存在同时运行的情况 [打印本页]

作者: lonron    时间: 2023-3-16 21:33     标题: [已解决]如何禁止批处理自身存在同时运行的情况

本帖最后由 lonron 于 2023-3-17 08:52 编辑

我有一个批处理,如果同时运行两个以上会出现各种兼容错误,如果为了容错去修改代码那就太麻烦了,毕竟容错这个问题就不太可能做到完美。
所以,我能想到的一个方法就是用
  1. tasklist /fi "windowtitle eq 管理员:  title"
复制代码
进行判断,不过这样一来一个也运行不了了。
还有别的方法或者如何用/fi开关也可以巧妙的实现?
作者: jyswjjgdwtdtj    时间: 2023-3-16 21:57

你可以在某个地方建个文件啊
比如第一个bat运行 发现那里没有指定文件 然后创建 继续运行
第二个bat运行 发现那里有文件 退出
作者: lonron    时间: 2023-3-16 22:10

回复 2# jyswjjgdwtdtj


    是的,我有想过这个方法,但实际情况是东西不只是我一个人用,不然就不用特意去判断是否同时运行了。
如果用这种方式会出现一个问题,就是在运行第一个.bat时如果中途人为或者因为某些原因中断了,那么还没来得及删掉这个“标记文件”就已经不存在实体了,那么第二次运行的时候就会怎么也启动不了了。
我想我应该没理解错吧。
作者: Batcher    时间: 2023-3-16 22:15

回复 1# lonron


参考:批处理单例脚本禁止重复运行
http://bbs.bathome.net/thread-16369-1-1.html
作者: Five66    时间: 2023-3-16 22:40

利用临时文件
生成临时文件,随便写些东西进去,例如'未完成'
执行时判断临时存在是否,存在就判断内容是否符合,例如里面内容是不是'未完成',是就不执行,否就重新生成后执行
不存在就生成后执行,执行完后删除
作者: lonron    时间: 2023-3-16 22:44

回复 5# Five66


    那和2楼说的一样,这样的话中途人为断开就完了,下次启动就再也启动不了了
作者: Five66    时间: 2023-3-16 22:50

回复 6# lonron
都说了还要判断临时文件的内容了
生成临时文件,写入'未完成',正常结束后直接删除
不正常结束会存在文件并且里面内容是'未完成',这样一来就能判断是否正常结束了
唯一的问题就是未正常结束时可能带来的影响
作者: Five66    时间: 2023-3-16 22:56

回复 7# Five66
1个文件不行就用2个文件
作者: lonron    时间: 2023-3-16 22:57

回复 7# Five66


    判断内容和判断是否存在这个临时文件有啥区别啊。你想啊,如果说第一次运行.bat的时候初始化阶段就生成一个.tmp,并在里面写上“未完成”。这时候如果.bat是正常运行还没退出的情况下。我再点一次.bat,按你的说法是这时候.tmp还在,内容还是“未完成”,这种时候第二个文件就不能运行对吧?那如果在这时候第一个文件我把他人为关掉,也就是还没运行到删除.tmp的阶段,这时候重新运行一次.bat,你告诉我他是能运行还是不能运行?我应该没理解错吧?
作者: lonron    时间: 2023-3-16 23:06

本帖最后由 lonron 于 2023-3-16 23:11 编辑

回复 7# Five66


    本质上我并不是要判断这个.bat是不是正常结束的。而是在正常运行阶段不能有两个以上的同一.bat在运行着。你说的这个生成一个.tmp方法我也想过,那都是“防君子不防小人”,因为要考虑代码非正常流程走完后退出的情况。至于异常退出这个我想过了,因为我这个程序需要借助第三方程序,有写了下载模块。所以本身就需要在%tmp%放程序。在初始化阶段直接判断是否存在临时文件夹xxx,有的话就rd命令删了。所以不影响新的执行过程。只是同时存在的话就会出大错了。
作者: Five66    时间: 2023-3-17 01:20

本帖最后由 Five66 于 2023-3-17 03:00 编辑

回复 9# lonron

额,回头想想好像确实是这样
作者: 77七    时间: 2023-3-17 04:48

  1. @echo off
  2. title 临时标题
  3. tasklist /fi "windowtitle eq 实际标题" | findstr "信息:" 1>nul 2>nul && (echo 不存在另一个正在运行的同脚本) || (echo 存在另一个正在运行的同脚本)
  4. title 实际标题
  5. rem ...
  6. pause
复制代码


这样可以吗?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2