[特效代码][已解决]批处理如何禁止batch程序二重启动?

[特效代码][已解决]批处理如何禁止batch程序二重启动?

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

✧ 相关推荐 ✧

逆水寒手游怎么解除情缘?关系断缘流程,冷静期规则说明
M4A4 | 战场之星 (久经沙场)
Microsoft 365安卓

M4A4 | 战场之星 (久经沙场)

📅 07-22 👁️ 9758
什么是跳蛋 女性使用跳蛋的注意事项
365bet体育官网网址

什么是跳蛋 女性使用跳蛋的注意事项

📅 07-13 👁️ 1421