[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 2
我来学习。

回复 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

评分人数

    • CrLf: 乐于助人技术 + 1
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 4# cjiabing


进程不合适吧,我随便打开一个cmd窗口,再去双击那个bat,这样不是会误判吗?

TOP

回复 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

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

我把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
我来学习。

TOP

本帖最后由 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
复制代码

参考:批处理与进程
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

TOP

  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
复制代码

TOP

返回列表