标题: [己解决]批处理可否检测自己是否已经在运行? [打印本页]
作者: xjiain 时间: 2011-8-2 16:00 标题: [己解决]批处理可否检测自己是否已经在运行?
本帖最后由 xjiain 于 2011-8-4 16:56 编辑
想在开始执行前,检测自己是否正在运行了,免得重复执行。
作者: tmplinshi 时间: 2011-8-2 18:06
- @echo off
- :: --------------------- 检测自己是否已运行 ---------------------
- set title=[%~f0]
-
- set /fi=/fi "imagename eq cmd.exe" /fi "windowtitle eq %title%"
- tasklist %/fi% 2>nul | findstr . >nul && (
- echo "%~f0" 已经运行。按任意键退出...
- pause >nul
- exit /b
- )
-
- title %title%
- :: --------------------- / 检测自己是否已运行 ---------------------
-
- pause
复制代码
作者: CUer 时间: 2011-8-2 23:55
类似设计模式中的单例模式?呵呵,有意思。
不过2楼主版主的方法应该还不算单例模式,我把bat复制到另外一个目录,就能启动两个了吧。
不知道楼主的具体要求到哪个层次。
作者: cjiabing 时间: 2011-8-3 00:52
本帖最后由 cjiabing 于 2011-8-3 02:56 编辑
不好用“set title=[%~f0]”,需要用固定模式的。原因正如楼上所言!
指定窗口存在则退出。
- :loop
- ::假如不存在某个进程名称就返回,否则等待给进程结束。
-
- 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)
- 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
那就这样:- @echo off
-
- :: --------------------- 检测自己是否已运行 ---------------------
- set title=##1##
-
- title %title%
-
- set /fi=/fi "imagename eq cmd.exe" /fi "windowtitle eq %title%"
- tasklist /nh %/fi% 2>nul | more +2 | findstr . >nul && (
- echo 已经运行。按任意键退出...
- pause >nul
- exit /b
- )
- :: --------------------- / 检测自己是否已运行 ---------------------
-
- pause
复制代码
不管复制到哪里,改成什么名,都只能运行自己一次。
作者: CUer 时间: 2011-8-3 22:53
回复 4# cjiabing
进程不合适吧,我随便打开一个cmd窗口,再去双击那个bat,这样不是会误判吗?
作者: cjiabing 时间: 2011-8-4 02:04
回复 7# CUer
- @echo off
- 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
- echo 本程序一共打开了 %num% 个。
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |