Board logo

标题: [文件管理] [分享]两个批处理程序间的参数传递 [打印本页]

作者: cjiabing    时间: 2011-6-12 20:12     标题: [分享]两个批处理程序间的参数传递

两个批处理间的参数(数值)传递,方法有许多,下面介绍“TT”(Title和Tasklist)法。
有两个批处理程序,A.bat和B.bat,其中A程序代码如下:
  1. @echo off
  2. :a
  3. for /f "tokens=2" %%a in  ('TASKLIST /FI "IMAGENAME eq QQ.exe" /FI "STATUS eq running" /FO TABLE /NH') do title ◇:有QQ程序在运行,进程PID“%%a”
  4. for /f "tokens=2" %%a in  ('tasklist /fi "WINDOWTITLE eq 铁哥 " /FO TABLE /NH') do title ◇:存在指定名称的进程窗口,进程PID“%%a”
  5. ping /n 5 127.0.1>nul
  6. title 主进程
  7. goto a
复制代码

B程序代码如下:
  1. @echo off
  2. :b
  3. for /f "tokens=9,* delims=: " %%a in ('"tasklist /v  /fi "IMAGENAME eq cmd.exe" /FO TABLE /NH"') do (
  4.         if /i %%a==◇  echo %%b
  5. )
  6. ping /n 3 127.0.1>nul
  7. title 检测进程
  8. goto :b
复制代码


运行A,然后运行B。
A程序用于检测QQ是否运行,以及指定昵称的QQ消息窗口是否存在。假如存在就把该QQ的PID发送到其cmd.exe的标题。
B程序用于检测指定标题的cmd.exe进程,假如该指定进程名称出现“◇”开头,“:”为分割的标题,则读取该标题上的信息。读取之后你可以利用这些信息,比如用来结束该QQ。
以上只是举例,问题还是比较多的,自己根据实际需要解决,就不详述了。
作者: mxxcgzxxx    时间: 2011-6-13 11:24

也就是通过特殊格式的CMD标题来传递信息,
那为什么不用临时文本来传递呢?不是更简单?反正都是双开无限循环.
作者: cjiabing    时间: 2011-6-20 22:44

2# mxxcgzxxx
你说的也是,效率可能不是很好,但这样做的目的就是不用临时文件!~
而且,所有监控都涉及循环,而循环对批处理而言都不是件好处理的事情,CPU会狂飙地!~
作者: cjiabing    时间: 2011-6-20 23:44

来一个详细的演示,用A检测IE,用B发出执行指令。
主程序:

  1. @echo off
  2. ::主程序
  3. :获取检测结果
  4. for /f "tokens=9,10* delims=: " %%a in ('"tasklist /v /fi "IMAGENAME eq cmd.exe" /FO TABLE /NH"') do (
  5. if /i %%a==◇ (echo %%b %%c&call :执行命令&%var% %%c)
  6. )
  7. ping /n 3 127.0.1>nul
  8. if "%var%"=="" title 主程序
  9. goto :获取检测结果
  10. :执行命令
  11. echo,&set var=
  12. set /p var= 请输入需要执行的命令(Y-结束IE;N-退出程序;直接回车返回):
  13. if "%var%"=="" (set "var=title ◆:echo"&&goto :eof)
  14. if /i "%var%"=="y" goto 结束进程
  15. if /i "%var%"=="n" goto 自动退出
  16. goto :eof
  17. :结束进程
  18. set "var=title ◆:taskkill /f /t /pid %1"
  19. goto :eof
  20. :自动退出
  21. set "var=title ◆:exit"
  22. goto :eof
复制代码


子程序
  1. @echo off
  2. ::介绍
  3. :: A 程序为子程序,用于检测是否存在 IE ,并接收和执行 B 发送的指令。
  4. :: B 程序为主程序,用于接收检测结果,并向 A 发出执行指令。
  5. :检测进程
  6. ::检测运行中的进程
  7. for /f "tokens=2" %%a in  ('TASKLIST /FI "IMAGENAME eq IEXPLORE.exe" /FI "STATUS eq running" /FO TABLE /NH') do title ◇:有IE运行,进程PID %%a
  8. ::检测指定窗口名的进程
  9. for /f "tokens=2" %%a in  ('tasklist /fi "WINDOWTITLE eq 小白兔 " /FO TABLE /NH') do title ◇:存在指定名称的进程窗口,进程PID %%a
  10. ping /n 5 127.0.1>nul
  11. call :接收指令
  12. title 子程序
  13. goto 检测进程
  14. :接收指令
  15. for /f "tokens=9,* delims=: " %%a in ('"tasklist /v  /fi "IMAGENAME eq cmd.exe" /FO TABLE /NH"') do (
  16.         if /i %%a==◆  (%%b)
  17. )
  18. goto :eof
复制代码

作者: mstsc    时间: 2011-7-17 19:41

看着这些复杂的代码,我是多么的希望自己能看懂。哎,想先学点简单的都不知道在那里找
作者: cjiabing    时间: 2011-7-18 00:29

5# mstsc 这个不是很难吧,主要涉及For、if、tastlist等命令。
作者: flaven    时间: 2013-2-6 11:47

思路好巧妙




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