Board logo

标题: [网络连接] [已解决]有什么更好的方法实现批处理的多线程 [打印本页]

作者: stuqx    时间: 2009-6-26 12:59     标题: [已解决]有什么更好的方法实现批处理的多线程

想做个检查局域网都有哪些机器开着的批处理
先做了个这样的
  1. @echo off
  2. for /l %%a in (2,1,254) do (
  3. echo 192.168.0.%%a
  4. ping 192.168.0.%%a /n 1 |find "TTL"&&(echo 192.168.0.%%a >>result.dat)
  5. )
  6. goto :eof
复制代码
发现速度太慢了

后来又改成这样的
  1. @echo off
  2. for /l %%a in (2,1,254) do (
  3. echo 192.168.0.%%a
  4. ping 127.0.0.1 -n 1
  5. start /min cmd /c "ping 192.168.0.%%a /n 1 |find "TTL"&&(echo 192.168.0.%%a >>d:\result.txt)"
  6. )
  7. goto :eof
复制代码
使用多线程的   发现这样开的窗口太多了   加个 ping 127.0.0.1 -n 1是因为怕开的太快机器响应不过来
但还是觉得进程太多了   
有没有其他更好的办法实现这个功能
在网上找了下  没发现其他批处理的实现多线程的方法




再附加个问题:
批处理对双引号是怎么判断的,比如这句
start /min cmd /c "ping 192.168.0.%%a /n 1 |find "TTL"&&(echo 192.168.0.%%a >>d:\result.txt)"
这句可以正确把引号配对运行   但为什么程序就不会认为是前面一对引号,后面一对引号   为什么可以正确的认识是两对引号嵌套呢
start /min cmd /c "ping 192.168.0.%%a /n 1 |find "TTL"&&(echo 192.168.0.%%a >>d:\result.txt)"
start /min cmd /c "ping 192.168.0.%%a /n 1 |find "TTL"&&(echo 192.168.0.%%a >>d:\result.txt)"

[ 本帖最后由 stuqx 于 2009-6-26 16:31 编辑 ]
作者: keen    时间: 2009-6-26 14:43     标题: 回复 1楼 的帖子

试试这个:
  1. @echo off
  2. set /p network=请输入网络号(例如:192.168.1):
  3. for /l %%i in (1 1 254) do (
  4.      start /b ping %network%.%%i>nul&echo 连接:%network%.%%i
  5. )
  6. arp -a|find /v "00-00-00-00-00-00"
  7. pause
复制代码

作者: stuqx    时间: 2009-6-26 15:06

呵呵   谢谢了   没注意到/b这个参数     
呵呵  又学了一招
作者: stuqx    时间: 2009-6-26 15:07

那第二个问题能不能给我介绍下大概呢
作者: zqz0012005    时间: 2009-6-26 15:21

为什么程序就不会认为是前面一对引号,后面一对引号

预处理时本来就是这样认为的。
至于预处理后就是程序自己来处理了(CMD)。CMD处理引号的方式见cmd /?

看下面的例子:
  1. @echo off
  2. echo a^&b>1.txt
  3. cmd /c "type 1.txt|find "a"&& echo yes"
  4. cmd /c "type 1.txt|find "&"&& echo yes"
  5. pause
复制代码

作者: stuqx    时间: 2009-6-26 15:52

  1. 如果指定了 /C 或 /K,命令行开关后的命令行其余部分将作为命令行处
  2. 理;在这种情况下,会使用下列逻辑处理引号字符("):
  3.     1.  如果符合下列所有条件,那么在命令行上的引号字符将被
  4.         保留:
  5.         - 不带 /S 命令行开关
  6.         - 整整两个引号字符
  7.         - 在两个引号字符之间没有特殊字符,特殊字符为下列中的
  8.           一个: <>()@^|
  9.         - 在两个引号字符之间有至少一个空白字符
  10.         - 在两个引号字符之间有至少一个可执行文件的名称。
  11.     2.  否则,老办法是,看第一个字符是否是一个引号字符,如果
  12.         是,舍去开头的字符并删除命令行上的最后一个引号字符,
  13.         保留最后一个引号字符之后的文字。
复制代码
看到了   确实如此
作者: stuqx    时间: 2009-6-26 15:57

原帖由 keen 于 2009-6-26 14:43 发表
试试这个:
@echo off
set /p network=请输入网络号(例如:192.168.1):
for /l %%i in (1 1 254) do (
     start /b ping %network%.%%i>nul&echo 连接:%network%.%%i
)
arp -a|find /v "00-00-00-00-00-00" ...


刚才试了下你这个  只是这个不是多线程   太慢了   254个地址要老久才能测完
作者: stuqx    时间: 2009-6-26 15:59

还有没有其他有关批处理多线程的好代码呢
作者: zqz0012005    时间: 2009-6-26 16:06

批处理本来就不支持多线程。
作者: stuqx    时间: 2009-6-26 16:29

那算了   结帖了




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