liuzhao0718
发短消息
加为好友
liuzhao0718
当前离线
UID47077 帖子6 精华0 积分29 PB29 技术0 捐助0 阅读权限5 在线时间8 小时 注册时间2012-4-13 最后登录2012-4-25
列兵
帖子6 积分29 技术0 捐助0 注册时间2012-4-13
1楼
跳转到 »
倒序看帖
打印
字体大小: tT
发表于 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程序删除?或者有其他方法能达到禁止二重启动的效果?
谢谢!
=====================================================
经过调查,有如下方案与大家共享@echo off
CALL :Main %* 3>>%0
GOTO :Eof
:Main
ECHO 运行过程中无法启动第二个此脚本
PAUSE
:Eof复制代码再次感谢版主CrLf给我提供的帮助
收藏
分享
gawk
发短消息
加为好友
gawk
当前离线
UID42456 帖子1088 精华0 积分5421 PB5097 技术98 捐助30 阅读权限99 在线时间239 小时 注册时间2011-10-9 最后登录2016-8-6
少将
帖子1088 积分5421 技术98 捐助30 注册时间2011-10-9
2楼
发表于 2012-4-13 23:12
| 只看该作者
把d:\tmp\abc.tmp设置为隐藏
TOP
liuzhao0718
发短消息
加为好友
liuzhao0718
当前离线
UID47077 帖子6 精华0 积分29 PB29 技术0 捐助0 阅读权限5 在线时间8 小时 注册时间2012-4-13 最后登录2012-4-25
列兵
帖子6 积分29 技术0 捐助0 注册时间2012-4-13
3楼
发表于 2012-4-13 23:16
| 只看该作者
回复 2# gawk
谢谢你的回答。
但是,如果用户的文件夹目录设置为 可见隐藏文件 的话,还是可以删除那个临时文件的呢。。
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID30406 帖子6388 精华2 积分18843 PB15777 技术982 捐助100 阅读权限255 在线时间5538 小时 注册时间2010-10-9 最后登录2025-3-26
论坛巡查
帖子6388 积分18843 技术982 捐助100 注册时间2010-10-9
4楼
发表于 2012-4-13 23:22
| 只看该作者
俺最爱的句柄占用法:@echo off
%1 %0 : 3>>%0||exit
echo 运行过程中无法启动第二个此脚本
pause复制代码
2
评分人数
77七:
乐于助人技术 + 1
lllsoslll:
精巧!技术 + 1
链接:在线第三方命令行工具下载 bat、vbs、js 原生混编
TOP
liuzhao0718
发短消息
加为好友
liuzhao0718
当前离线
UID47077 帖子6 精华0 积分29 PB29 技术0 捐助0 阅读权限5 在线时间8 小时 注册时间2012-4-13 最后登录2012-4-25
列兵
帖子6 积分29 技术0 捐助0 注册时间2012-4-13
5楼
发表于 2012-4-13 23:28
| 只看该作者
回复 4# CrLf
多谢赐教!膜拜大牛!
能帮小弟解释下不。。。原来都是做Linux perl脚本的,对Batch不是很熟悉,惭愧惭愧
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID30406 帖子6388 精华2 积分18843 PB15777 技术982 捐助100 阅读权限255 在线时间5538 小时 注册时间2010-10-9 最后登录2025-3-26
论坛巡查
帖子6388 积分18843 技术982 捐助100 注册时间2010-10-9
6楼
发表于 2012-4-13 23:39
| 只看该作者
回复 5# liuzhao0718
重启脚本的同时,打开句柄3占用自身,这样在运行过程中,只要进程不挂就能保持脚本自身的文件句柄始终是 open 状态,这样再次双击运行时,两个进程的句柄无法同时占用同一个文件,随即出错退出
链接:在线第三方命令行工具下载 bat、vbs、js 原生混编
TOP
gawk
发短消息
加为好友
gawk
当前离线
UID42456 帖子1088 精华0 积分5421 PB5097 技术98 捐助30 阅读权限99 在线时间239 小时 注册时间2011-10-9 最后登录2016-8-6
少将
帖子1088 积分5421 技术98 捐助30 注册时间2011-10-9
7楼
发表于 2012-4-13 23:43
| 只看该作者
回复 5# liuzhao0718
Linux Perl脚本用的是什么方法?无非就是文件锁、进程名判断等。几十万块一套的商业软件也是用的pid file lock,可以就此咨询一下你的老大对此有何看法。
TOP
liuzhao0718
发短消息
加为好友
liuzhao0718
当前离线
UID47077 帖子6 精华0 积分29 PB29 技术0 捐助0 阅读权限5 在线时间8 小时 注册时间2012-4-13 最后登录2012-4-25
列兵
帖子6 积分29 技术0 捐助0 注册时间2012-4-13
8楼
发表于 2012-4-14 00:59
| 只看该作者
回复 6# CrLf
感谢你的讲解。
对于其中“%1 %0 : ”这段代码还是有点困惑。
%1 应该是bat的第一个形参,%0是bat自身。冒号的意义还不大清楚,网上查了一下,只有标号符一种解释...
“%1 %0 : ”应该是对bat自身的调用
“%1 %0 : ”中%1是没有定义的,那为什么“%0 :”这样写不可以呢?
望请赐教
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID30406 帖子6388 精华2 积分18843 PB15777 技术982 捐助100 阅读权限255 在线时间5538 小时 注册时间2010-10-9 最后登录2025-3-26
论坛巡查
帖子6388 积分18843 技术982 捐助100 注册时间2010-10-9
9楼
发表于 2012-4-14 01:31
| 只看该作者
回复 8# liuzhao0718
%1 %0 : 这句的意思是,启动自身,并传递命令行参数为 :,将自身重新启动后,由于 %1 的值为 :,因此本行被视为标签而不会执行,避免出现反复调用自身的无限循环,这个技巧适用于不需保留脚本原有参数而重启自身一次的情况
1
评分人数
liuzhao0718:
多谢赐教技术 + 1
链接:在线第三方命令行工具下载 bat、vbs、js 原生混编
TOP
liuzhao0718
发短消息
加为好友
liuzhao0718
当前离线
UID47077 帖子6 精华0 积分29 PB29 技术0 捐助0 阅读权限5 在线时间8 小时 注册时间2012-4-13 最后登录2012-4-25
列兵
帖子6 积分29 技术0 捐助0 注册时间2012-4-13
10楼
发表于 2012-4-16 19:30
| 只看该作者
本帖最后由 liuzhao0718 于 2012-4-16 22:52 编辑
回复 9# CrLf
如果bat文件是有参数的形式,二重启动防止的程序应该怎么去做呢?
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID30406 帖子6388 精华2 积分18843 PB15777 技术982 捐助100 阅读权限255 在线时间5538 小时 注册时间2010-10-9 最后登录2025-3-26
论坛巡查
帖子6388 积分18843 技术982 捐助100 注册时间2010-10-9
11楼
发表于 2012-4-17 23:10
| 只看该作者
回复 10# liuzhao0718
同理@echo off
if %~d0 neq \\ "\\.\%~f0" 3>>%0||exit
echo 无法启动第二个此脚本
pause复制代码
链接:在线第三方命令行工具下载 bat、vbs、js 原生混编
TOP
noender
发短消息
加为好友
noender
当前离线
UID81961 帖子112 精华0 积分141 PB141 技术0 捐助0 阅读权限20 在线时间74 小时 注册时间2017-9-26 最后登录2025-5-12
一级士官
帖子112 积分141 技术0 捐助0 注册时间2017-9-26
12楼
发表于 2019-1-24 14:41
| 只看该作者
回复 4# CrLf
大神。。你的这个代码。。在不转成EXE下是可行的。。但是为什么BAT转成了EXE就不行了。直接退出的。
TOP
lonron
发短消息
加为好友
lonron
当前离线
UID116625 帖子99 精华0 积分173 PB170 技术1 捐助0 阅读权限20 在线时间39 小时 注册时间2023-1-13 最后登录2024-11-9
二级士官
帖子99 积分173 技术1 捐助0 注册时间2023-1-13
13楼
发表于 2024-4-22 11:58
| 只看该作者
回复 4# CrLf
老师,用了这段代码,如果在运行完所有代码后,需要怎么写或修改才可以删除自身呢?重定向句柄 3>nul 貌似没用,恳请老师解答,谢谢
TOP
buyiyang
发短消息
加为好友
buyiyang
当前离线
UID107961 帖子474 精华0 积分882 PB495 技术129 捐助0 阅读权限40 在线时间482 小时 注册时间2022-3-26 最后登录2025-8-14
中尉
帖子474 积分882 技术129 捐助0 注册时间2022-3-26
14楼
发表于 2024-4-22 12:24
| 只看该作者
回复 13# lonron
运行完加个del就行@echo off
%1 %0 : 3>>%0&del %0||exit
echo 运行过程中无法启动第二个此脚本
pause复制代码
2
评分人数
lonron:
感谢解惑技术 + 1
czjt1234:
果然可行技术 + 1
TOP
aloha20200628
发短消息
加为好友
aloha20200628
当前离线
UID105859 帖子1467 精华0 积分2505 PB1488 技术339 捐助0 阅读权限70 在线时间1504 小时 注册时间2021-10-13 最后登录2025-8-17
中校
帖子1467 积分2505 技术339 捐助0 注册时间2021-10-13
15楼
发表于 2024-4-22 18:13
| 只看该作者
爬完本帖,感觉有点意思,到头来虽可防止脚本在运行期间不能再被重复启动,但却可启动一个与本脚本内容完全相同的异名脚本,所以当年楼主及其老大的防范初衷...
TOP