Board logo

标题: [己解决]批处理可否检测自己是否已经在运行? [打印本页]

作者: xjiain    时间: 2011-8-2 16:00     标题: [己解决]批处理可否检测自己是否已经在运行?

本帖最后由 xjiain 于 2011-8-4 16:56 编辑

想在开始执行前,检测自己是否正在运行了,免得重复执行。
作者: tmplinshi    时间: 2011-8-2 18:06

  1. @echo off
  2. :: --------------------- 检测自己是否已运行 ---------------------
  3. set title=[%~f0]
  4. set /fi=/fi "imagename eq cmd.exe" /fi "windowtitle eq %title%"
  5. tasklist %/fi% 2>nul | findstr . >nul && (
  6.     echo "%~f0" 已经运行。按任意键退出...
  7.     pause >nul
  8.     exit /b
  9. )
  10. title %title%
  11. :: --------------------- / 检测自己是否已运行 ---------------------
  12. pause
复制代码

作者: CUer    时间: 2011-8-2 23:55

类似设计模式中的单例模式?呵呵,有意思。
不过2楼主版主的方法应该还不算单例模式,我把bat复制到另外一个目录,就能启动两个了吧。
不知道楼主的具体要求到哪个层次。
作者: cjiabing    时间: 2011-8-3 00:52

本帖最后由 cjiabing 于 2011-8-3 02:56 编辑

不好用“set title=[%~f0]”,需要用固定模式的。原因正如楼上所言!
指定窗口存在则退出。

  1. :loop
  2. ::假如不存在某个进程名称就返回,否则等待给进程结束。
  3. for /f "tokens=1" %%a in ('tasklist /fi "IMAGENAME eq QQ.exe" /FO TABLE /NH') do if /i "%%a"=="QQ.exe" (ping /n 2 127.0.1>nul&goto :loop)
  4. goto :eof
复制代码

参考:批处理与进程
作者: xjiain    时间: 2011-8-3 13:02

我把BAT编译成了EXE。
代码中加入了这一段代码。
set runing=0
for /f "tokens=1" %%a in ('tasklist /FO TABLE /NH') do (
if /i "%~dp0%%a"==%0 set /a runing+=1
)
if "%runing%" GTR "1"  exit
作者: tmplinshi    时间: 2011-8-3 13:25

回复 3# CUer


那就这样:
  1. @echo off
  2. :: --------------------- 检测自己是否已运行 ---------------------
  3. set title=##1##
  4. title %title%
  5. set /fi=/fi "imagename eq cmd.exe" /fi "windowtitle eq %title%"
  6. tasklist /nh %/fi% 2>nul | more +2 | findstr . >nul && (
  7.     echo 已经运行。按任意键退出...
  8.     pause >nul
  9.     exit /b
  10. )
  11. :: --------------------- / 检测自己是否已运行 ---------------------
  12. pause
复制代码
不管复制到哪里,改成什么名,都只能运行自己一次。
作者: CUer    时间: 2011-8-3 22:53

回复 4# cjiabing


进程不合适吧,我随便打开一个cmd窗口,再去双击那个bat,这样不是会误判吗?
作者: cjiabing    时间: 2011-8-4 02:04

回复 7# CUer


   
  1. @echo off
  2. for /f "tokens=1 delims=[]" %%a in ('cmd /c "wmic process where name="cmd.exe" get CommandLine" ^| find /i "%~f0" ^| find /i /n "%~f0"') do set /a num=%%a-1
  3. echo 本程序一共打开了 %num% 个。
  4. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2