Board logo

标题: [其他] 批处理如何检测进程中程序的运行? [打印本页]

作者: coolmir2    时间: 2009-3-11 03:59     标题: 批处理如何检测进程中程序的运行?

我想写一个批处理,检测一个软件是否运行,如果没有运行就提示是否运行这个程序,当输入“Y”时就运行这个程序,否则关闭,而这个程序具体在硬盘什么地方还不知道。只知道可执行程序(比如说QQ.exe但不知道它路径)当启动这个程序后延时5秒后执行下一个批处理。

[ 本帖最后由 coolmir2 于 2009-3-13 01:22 编辑 ]
作者: newxso    时间: 2009-3-13 19:25

  1. @echo off
  2. ::定义要启动的程序名称
  3. set "pro_name=QQ.exe"
  4. for /f "delims=" %%a in ("%pro_name%") do set "name=%%~na_path"
  5. ::如果记录路径的文件存在则直接提取程序路径
  6. if not exist c:\windows\%name%.txt goto :0001
  7. for /f "delims=" %%a in (c:\windows\%name%.txt) do (
  8.   set pro_path=%%~a
  9.   set p_name=%%~nxa
  10. )
  11. if /i "%p_name%"=="%pro_name%" goto :0002
  12. :0001
  13. echo 正在搜索 %pro_name%,请稍等...
  14. for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  15.   if exist %%a:\ (
  16.     pushd %%a:\
  17.     for /r %%b in ("*%pro_name%") do (
  18.       if /i "%%~nxb"=="%pro_name%" set "pro_path=%%b")
  19.     popd
  20. ))
  21. ::用文本记录程序路径以便下次快速获取
  22. echo/%pro_path%>c:\windows\%name%.txt&cls
  23. if not "%pro_path%"=="" (
  24. echo 检测成功,程序安装在:%pro_path%
  25. ) else (
  26. echo 没有检测到 %pro_name% 程序!
  27. ping 127.1 /n ^3>nul&&exit/b
  28. )
  29. :0002
  30. ::检测程序是否运行
  31. tasklist|find /i "%pro_name%" >nul||goto :0003
  32. echo 程序已经在运行,3秒后自动退出...
  33. ping 127.1 /n ^3>nul&&exit/b
  34. :0003
  35. cls
  36. echo 已经启动提问提示框,如果运行该程序请点击“是”按扭!
  37. echo Wsh.Echo MsgBox("   你想运行%pro_name%吗?",vbYesNo,"询问")>ask.vbs
  38. for /f %%d in ('cscript ask.vbs //nologo //e:vbscript') do if %%d equ 6 (del ask.vbs&&goto :0004)
  39. cls
  40. echo 你没有选择启动程序,3秒后自动退出...
  41. del ask.vbs
  42. ping 127.1 /n ^3>nul&&exit/b
  43. :0004
  44. cls
  45. echo 正在启动 %pro_name% ...
  46. start "" "%pro_path%"
  47. ping 127.1 /n ^5>nul
  48. start "" c:\test\test.bat
  49. exit/b
复制代码

完善一下之前的代码,增加对记录路径文本的内容检测,把全盘搜索用 for /r 语句代替,提高搜索文件的速度。

[ 本帖最后由 newxso 于 2009-3-15 21:05 编辑 ]
作者: Batcher    时间: 2009-3-13 22:09

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 指定进程名称
  4. set "ProcessName=notepad.exe"
  5. rem 指定软件名称
  6. set "strFileName=notepad.exe"
  7. rem 指定待运行的下一个批处理
  8. set NextBat=C:\test\a.bat
  9. set strFileDirc=
  10. set UserInput=
  11. tasklist|find /i "%ProcessName%"||set /p UserInput=是否运行程序%strFileName%?
  12. if /i "%UserInput%" equ "Y" (
  13.   echo 正在启动软件%strFileName%,请稍候...
  14.   call :GetFileDirc !strFileName! strFileDirc
  15.   if "!strFileDirc!" neq "" (
  16.     start "" "%strFileDirc%"
  17.     ping -n 6 127.1 >nul
  18.     start "" "%NextBat%"
  19.   ) else (
  20.     echo 找不到软件%strFileName%
  21.   )
  22. ) else (
  23.   goto :eof
  24. )
  25. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  26. ::call :GetFileDirc %strFileName% strFileDirc
  27. :GetFileDirc
  28. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  29. :GetFileDirc
  30. for %%a in ("%1") do (
  31.   set "nName=%%~na"
  32.   set "xName=%%~xa"
  33. )
  34. set "xName=%xName:~1%"
  35. for /f "skip=1 delims=" %%a in ('wmic datafile where "filename='%nName%' and Extension='%xName%'" get name') do (
  36.   set "%2=%%a"
  37. )
复制代码

作者: coolmir2    时间: 2009-3-14 00:09

谢谢,代码好多哦。看了半天没看懂。呵呵。那检测进程中程序的运行是那一个代码呢?
作者: 骚鸡    时间: 2009-3-14 12:11

复杂。。。。。。。。。。。。。。。。。。
作者: Batcher    时间: 2009-3-14 14:52     标题: 回复 4楼 的帖子

tasklist + find




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