Board logo

标题: [特效代码] [已解决]批处理如何禁止batch程序二重启动? [打印本页]

作者: liuzhao0718    时间: 2012-4-13 23:05     标题: [已解决]批处理如何禁止batch程序二重启动?

本帖最后由 liuzhao0718 于 2012-4-17 21:24 编辑

我有一个bat,主要功能是调用java模块。
现在要做一个防止它二重启动的功能。

我的想法是,
1.bat执行
2.判定文件(d:\tmp\abc.tmp)是否存在
3.存在:提示错误信息 并 退出程序
  不存在:创建文件(d:\tmp\abc.tmp)
REM  其他处理
n. 程序退出前删除文件(d:\tmp\abc.tmp)

老大说这样做不好,因为要是用户在bat执行后手动删除了文件(d:\tmp\abc.tmp)后,就不能起到禁止二重启动的效果了。

请问,是否能让文件(d:\tmp\abc.tmp)只能被 该bat程序删除?或者有其他方法能达到禁止二重启动的效果?
谢谢!

=====================================================
经过调查,有如下方案与大家共享
  1. @echo off
  2. CALL :Main %* 3>>%0
  3. GOTO :Eof
  4. :Main
  5. ECHO 运行过程中无法启动第二个此脚本
  6. PAUSE
  7. :Eof
复制代码
再次感谢版主CrLf给我提供的帮助
作者: gawk    时间: 2012-4-13 23:12

把d:\tmp\abc.tmp设置为隐藏
作者: liuzhao0718    时间: 2012-4-13 23:16

回复 2# gawk

谢谢你的回答。
但是,如果用户的文件夹目录设置为 可见隐藏文件 的话,还是可以删除那个临时文件的呢。。
作者: CrLf    时间: 2012-4-13 23:22

俺最爱的句柄占用法:
  1. @echo off
  2. %1 %0 : 3>>%0||exit
  3. echo 运行过程中无法启动第二个此脚本
  4. pause
复制代码

作者: liuzhao0718    时间: 2012-4-13 23:28

回复 4# CrLf


多谢赐教!膜拜大牛!
能帮小弟解释下不。。。原来都是做Linux perl脚本的,对Batch不是很熟悉,惭愧惭愧
作者: CrLf    时间: 2012-4-13 23:39

回复 5# liuzhao0718


    重启脚本的同时,打开句柄3占用自身,这样在运行过程中,只要进程不挂就能保持脚本自身的文件句柄始终是 open 状态,这样再次双击运行时,两个进程的句柄无法同时占用同一个文件,随即出错退出
作者: gawk    时间: 2012-4-13 23:43

回复 5# liuzhao0718


    Linux Perl脚本用的是什么方法?无非就是文件锁、进程名判断等。几十万块一套的商业软件也是用的pid file lock,可以就此咨询一下你的老大对此有何看法。
作者: liuzhao0718    时间: 2012-4-14 00:59

回复 6# CrLf


感谢你的讲解。

对于其中“%1 %0 : ”这段代码还是有点困惑。

%1 应该是bat的第一个形参,%0是bat自身。冒号的意义还不大清楚,网上查了一下,只有标号符一种解释...

“%1 %0 : ”应该是对bat自身的调用
“%1 %0 : ”中%1是没有定义的,那为什么“%0 :”这样写不可以呢?

望请赐教
作者: CrLf    时间: 2012-4-14 01:31

回复 8# liuzhao0718


    %1 %0 : 这句的意思是,启动自身,并传递命令行参数为 :,将自身重新启动后,由于 %1 的值为 :,因此本行被视为标签而不会执行,避免出现反复调用自身的无限循环,这个技巧适用于不需保留脚本原有参数而重启自身一次的情况
作者: liuzhao0718    时间: 2012-4-16 19:30

本帖最后由 liuzhao0718 于 2012-4-16 22:52 编辑

回复 9# CrLf


  如果bat文件是有参数的形式,二重启动防止的程序应该怎么去做呢?
作者: CrLf    时间: 2012-4-17 23:10

回复 10# liuzhao0718


    同理
  1. @echo off
  2. if %~d0 neq \\ "\\.\%~f0" 3>>%0||exit
  3. echo 无法启动第二个此脚本
  4. pause
复制代码

作者: noender    时间: 2019-1-24 14:41

回复 4# CrLf


    大神。。你的这个代码。。在不转成EXE下是可行的。。但是为什么BAT转成了EXE就不行了。直接退出的。
作者: lonron    时间: 2024-4-22 11:58

回复 4# CrLf


    老师,用了这段代码,如果在运行完所有代码后,需要怎么写或修改才可以删除自身呢?重定向句柄 3>nul 貌似没用,恳请老师解答,谢谢
作者: buyiyang    时间: 2024-4-22 12:24

回复 13# lonron


    运行完加个del就行
  1. @echo off
  2. %1 %0 : 3>>%0&del %0||exit
  3. echo 运行过程中无法启动第二个此脚本
  4. pause
复制代码

作者: aloha20200628    时间: 2024-4-22 18:13


爬完本帖,感觉有点意思,到头来虽可防止脚本在运行期间不能再被重复启动,但却可启动一个与本脚本内容完全相同的异名脚本,所以当年楼主及其老大的防范初衷...

作者: lonron    时间: 2024-4-23 09:48

回复 14# buyiyang


    话说后面的||exit他防止的错误是啥?前面这段句子还会存在错误返回的情况吗?如果不加这个判断的话,如果错误了是不是也会自己退出呢?




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