标题: 批处理如何检测自己已运行,及其它?[半解决] [打印本页]
作者: wolfan 时间: 2011-7-20 12:45 标题: 批处理如何检测自己已运行,及其它?[半解决]
本帖最后由 wolfan 于 2011-7-23 16:37 编辑
BAT可不可以检测自己是否以运行。
还有,如何在开户BAT时,创建一个文件来标示A。BAT正在运行,如果强关(不用指令)退出的话,在由一个隐藏的B。BAT来重启A。BAT呢?
补充:不是做XXOO,不过也可以用做其中模块之一的说。就是想让俺U盘有个BAT常用开以遍快速调用的说。
补充II:刚刚想到用 tasklist 来写检测得到 A.bat 的 title-Name 作为 tag 的标记,B.bat循环检察tasklist列表中是否有此标记来决定是否启动。
小dome- =a.bat
- title do.aBox.bat
- tasklist /v | find /i "do.aBox.bat" > do.sys
-
- =b.bat
- :top
- tasklist /v | find /i "do.aBox.bat" || start a.bat
- ping 127.1 -n 60 >nul
- goto top
复制代码
花喵~ a.bat中的写入do.sys 中好像无意义了~ 花喵,看来确实是小学没好好上课~ 头晕~
大人~ 请看下,这样做是不是可以确保自检重启呢~
如果可以,请改下标题的说~
人家小白做泡菜去~
作者: tmplinshi 时间: 2011-7-20 13:13
本帖最后由 tmplinshi 于 2011-7-20 13:43 编辑
需下载 nircmd- @echo off
-
- :: --------------------- 检测自己是否已运行 ---------------------
- set title=[%~nx0 is running]
-
- set /fi=/fi "imagename eq cmd.exe" /fi "windowtitle eq %title%"
- tasklist %/fi% 2>nul | findstr . >nul && (
- echo %~nx0 已经运行。按任意键退出...
- pause >nul
- exit /b
- )
-
- title %title%
- :: --------------------- / 检测自己是否已运行 ---------------------
-
- :: --------------------- 保持运行 ---------------------
- for /f "tokens=2" %%a in ('tasklist %/fi% /nh') do set pid=%%a
- start nircmd waitprocess /%pid% exec show "%~f0"
- :: --------------------- / 保持运行 ---------------------
-
- pause
复制代码
作者: CrLf 时间: 2011-7-20 13:21
检测自己是否已运行:- wmic process where "name=cmd.exe and commandline like '%%%~0%%' or commandline like '%%%~s0%%'" get name,commandline /value
复制代码
不过没明白在运行过程中检测自身是否已运行有何意义...
作者: cjiabing 时间: 2011-7-20 13:24
什么逻辑嘛?BAT检测自己已运行?假如BAT能检测当然它已经运行了,否则它连检测都不能检测。
错字连篇,语无伦次,看着吃力。
作者: tmplinshi 时间: 2011-7-20 13:48
本帖最后由 tmplinshi 于 2011-7-20 13:52 编辑
楼主的意思是同一个批处理只允许运行一个。很多软件都有这个选项。
作者: bluewing009 时间: 2011-7-20 17:08
三种方法:1标记文件:启动创建,退出删除,存在就说明有一个在运行2title利用tasklist获得title值判断3用wmic或者当前执行路径,判断。还有几种比较偏门的:1启动后劫持CMD不让另一个运行2启动后删除原位置另copy自身后运行,完毕后在copy回来3启动时获取cmd所有PID,利用findstr排除后一直taskkill
作者: wolfan 时间: 2011-7-20 18:08
哦` 抱歉,小学没学好,优甚语文。
关于自检,是这样的。
当A。BAT运行的时候,会在%Systemdir%中创建一个 TAG 空文件,做为标记,同时在创建一个B。BAT,并启动它(MIN后台运行)由B。BAT来监视A是否以运行,如果A关闭,而 TAG 空文件又没删除,那就重A。BAT。直到A。BAT通过指令删除了TAG(同时也可以关闭B。BAT)后才算是真正关闭。
归结下就是 创建,和检测 标记TAG来确定A。BAT的运行与否。
小白菜试了下,可是太幼小了,老是错误中。。。泣。
俺用MD创建,FIND来检测。
想应该完全可通过BAT来实现,不用每三方。
作者: cjiabing 时间: 2011-7-20 18:24
不必搞得那么复杂,你完全可以参考这篇同时提问的帖子的做法:http://www.bathome.net/thread-13344-1-1.html
作者: wolfan 时间: 2011-7-23 16:26
自己试卷也了个小DOME~ 反正是逻辑混乱~
啊还是当泡菜去好了,那个要~- Name=do.bat
-
- :open
- copy %0% %windir%
- :inDO.sys
- echo %date% >do.sys
- :inMIN
- echo :top >doMIN.bat
- echo type do.sys | find /i "%date%" && echo yes >do.sys || start %windir%\do.sys >>doMIN.bat
- echo ping 127.1 -n 60 >nul >>doMIN.bat
- echo goto top >>doMIN.bat
- :start_MIN
- start %windir%\doMIN.bat
-
- :do_box
- echo %date% >do.sys
- ping 127.1 -n 60 >nul
- goto do_box
-
- :keler
- ceho welcome.
复制代码
这是俺的方案一,逻辑上好像勉强,不过应该可以通过,可是实际运行起来老是错误。
泣~
刚刚在研了一遍DOS命令。
发现应该可以用 tasklist 可以更好的给TAG(do.sys)复值,可是对这个命令头晕中,求解。
想知如何用 tasklist查询出 CMD.exe 的 title 或者 pid。
如此一来就可用得出的 title or pid做标记,这样一来,do.bat就不用循环的给do.sys写入内容了。
只要doMIN.bat中固定时间检测相关的 PID与TITLE(do.baT) 就可以了。
可是小白菜就太泡菜了,到现也没用 tasklist 查出来,泣~ 不会用那些个筛选器~ 求解中。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |