[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

你可以在某个地方建个文件啊
比如第一个bat运行 发现那里没有指定文件 然后创建 继续运行
第二个bat运行 发现那里有文件 退出

TOP

回复 2# jyswjjgdwtdtj


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

TOP

回复 1# lonron


参考:批处理单例脚本禁止重复运行
http://bbs.bathome.net/thread-16369-1-1.html
1

评分人数

    • lonron: 思路很棒,就是我如果用.exe封装的话,认不 ...技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

利用临时文件
生成临时文件,随便写些东西进去,例如'未完成'
执行时判断临时存在是否,存在就判断内容是否符合,例如里面内容是不是'未完成',是就不执行,否就重新生成后执行
不存在就生成后执行,执行完后删除

TOP

回复 5# Five66


    那和2楼说的一样,这样的话中途人为断开就完了,下次启动就再也启动不了了

TOP

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

TOP

回复 7# Five66
1个文件不行就用2个文件

TOP

回复 7# Five66


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

TOP

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

回复 7# Five66


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

TOP

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

回复 9# lonron

额,回头想想好像确实是这样

TOP

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


这样可以吗?
1

评分人数

    • lonron: 去掉后面的 2>nul 可以达到效果技术 + 1
bat小白,请多指教!谢谢!

TOP

返回列表