找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22383|回复: 7

[己解决]批处理可否检测自己是否已经在运行?

[复制链接]
发表于 2011-8-2 16:00:36 | 显示全部楼层 |阅读模式
本帖最后由 xjiain 于 2011-8-4 16:56 编辑

想在开始执行前,检测自己是否正在运行了,免得重复执行。

评分

参与人数 1PB +2 收起 理由
CrLf + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-8-2 18:06:31 | 显示全部楼层
  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
复制代码
发表于 2011-8-2 23:55:03 | 显示全部楼层
类似设计模式中的单例模式?呵呵,有意思。
不过2楼主版主的方法应该还不算单例模式,我把bat复制到另外一个目录,就能启动两个了吧。
不知道楼主的具体要求到哪个层次。
发表于 2011-8-3 00:52:39 | 显示全部楼层
本帖最后由 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
复制代码

参考:批处理与进程
 楼主| 发表于 2011-8-3 13:02:35 | 显示全部楼层
我把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
发表于 2011-8-3 13:25:29 | 显示全部楼层
回复 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
复制代码
不管复制到哪里,改成什么名,都只能运行自己一次。

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 乐于助人

查看全部评分

发表于 2011-8-3 22:53:17 | 显示全部楼层
回复 4# cjiabing


进程不合适吧,我随便打开一个cmd窗口,再去双击那个bat,这样不是会误判吗?
发表于 2011-8-4 02:04:00 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 20:29 , Processed in 0.021116 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表