Board logo

标题: 批处理如何检测自己已运行,及其它?[半解决] [打印本页]

作者: 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
  1. =a.bat
  2. title do.aBox.bat
  3. tasklist /v | find /i "do.aBox.bat" > do.sys
  4. =b.bat
  5. :top
  6. tasklist /v | find /i "do.aBox.bat" || start a.bat
  7. ping 127.1 -n 60 >nul
  8. goto top
复制代码
花喵~ a.bat中的写入do.sys 中好像无意义了~ 花喵,看来确实是小学没好好上课~ 头晕~


大人~ 请看下,这样做是不是可以确保自检重启呢~ 
如果可以,请改下标题的说~ 
人家小白做泡菜去~ 
作者: tmplinshi    时间: 2011-7-20 13:13

本帖最后由 tmplinshi 于 2011-7-20 13:43 编辑

需下载 nircmd
  1. @echo off
  2. :: --------------------- 检测自己是否已运行 ---------------------
  3. set title=[%~nx0 is running]
  4. set /fi=/fi "imagename eq cmd.exe" /fi "windowtitle eq %title%"
  5. tasklist %/fi% 2>nul | findstr . >nul && (
  6.     echo %~nx0 已经运行。按任意键退出...
  7.     pause >nul
  8.     exit /b
  9. )
  10. title %title%
  11. :: --------------------- / 检测自己是否已运行 ---------------------
  12. :: --------------------- 保持运行 ---------------------
  13. for /f "tokens=2" %%a in ('tasklist %/fi% /nh') do set pid=%%a
  14. start nircmd waitprocess /%pid% exec show "%~f0"
  15. :: --------------------- / 保持运行 ---------------------
  16. pause
复制代码

作者: CrLf    时间: 2011-7-20 13:21

检测自己是否已运行:
  1. 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~ 反正是逻辑混乱~
啊还是当泡菜去好了,那个要~
  1. Name=do.bat
  2. :open
  3. copy %0% %windir%
  4. :inDO.sys
  5. echo %date% >do.sys
  6. :inMIN
  7. echo :top >doMIN.bat
  8. echo type do.sys | find /i "%date%" && echo yes >do.sys || start %windir%\do.sys >>doMIN.bat
  9. echo ping 127.1 -n 60 >nul >>doMIN.bat
  10. echo goto top >>doMIN.bat
  11. :start_MIN
  12. start %windir%\doMIN.bat
  13. :do_box
  14. echo %date% >do.sys
  15. ping 127.1 -n 60 >nul
  16. goto do_box
  17. :keler
  18. 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