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

[特效代码] [已解决]批处理如何禁止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给我提供的帮助

把d:\tmp\abc.tmp设置为隐藏

TOP

回复 2# gawk

谢谢你的回答。
但是,如果用户的文件夹目录设置为 可见隐藏文件 的话,还是可以删除那个临时文件的呢。。

TOP

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

评分人数

TOP

回复 4# CrLf


多谢赐教!膜拜大牛!
能帮小弟解释下不。。。原来都是做Linux perl脚本的,对Batch不是很熟悉,惭愧惭愧

TOP

回复 5# liuzhao0718


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

TOP

回复 5# liuzhao0718


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

TOP

回复 6# CrLf


感谢你的讲解。

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

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

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

望请赐教

TOP

回复 8# liuzhao0718


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

评分人数

TOP

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

回复 9# CrLf


  如果bat文件是有参数的形式,二重启动防止的程序应该怎么去做呢?

TOP

回复 10# liuzhao0718


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

TOP

回复 4# CrLf


    大神。。你的这个代码。。在不转成EXE下是可行的。。但是为什么BAT转成了EXE就不行了。直接退出的。

TOP

返回列表