标题: [网络连接] [已解决]有什么更好的方法实现批处理的多线程 [打印本页]
作者: stuqx 时间: 2009-6-26 12:59 标题: [已解决]有什么更好的方法实现批处理的多线程
想做个检查局域网都有哪些机器开着的批处理
先做了个这样的- @echo off
- for /l %%a in (2,1,254) do (
- echo 192.168.0.%%a
- ping 192.168.0.%%a /n 1 |find "TTL"&&(echo 192.168.0.%%a >>result.dat)
- )
- goto :eof
复制代码
发现速度太慢了
后来又改成这样的- @echo off
- for /l %%a in (2,1,254) do (
- echo 192.168.0.%%a
- 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)"
- )
- 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楼 的帖子
试试这个:
- @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"
- pause
复制代码
作者: stuqx 时间: 2009-6-26 15:06
呵呵 谢谢了 没注意到/b这个参数
呵呵 又学了一招
作者: stuqx 时间: 2009-6-26 15:07
那第二个问题能不能给我介绍下大概呢
作者: zqz0012005 时间: 2009-6-26 15:21
预处理时本来就是这样认为的。
至于预处理后就是程序自己来处理了(CMD)。CMD处理引号的方式见cmd /?
看下面的例子:- @echo off
- echo a^&b>1.txt
- cmd /c "type 1.txt|find "a"&& echo yes"
- cmd /c "type 1.txt|find "&"&& echo yes"
- pause
复制代码
作者: stuqx 时间: 2009-6-26 15:52
- 如果指定了 /C 或 /K,命令行开关后的命令行其余部分将作为命令行处
- 理;在这种情况下,会使用下列逻辑处理引号字符("):
- 1. 如果符合下列所有条件,那么在命令行上的引号字符将被
- 保留:
- - 不带 /S 命令行开关
- - 整整两个引号字符
- - 在两个引号字符之间没有特殊字符,特殊字符为下列中的
- 一个: <>()@^|
- - 在两个引号字符之间有至少一个空白字符
- - 在两个引号字符之间有至少一个可执行文件的名称。
- 2. 否则,老办法是,看第一个字符是否是一个引号字符,如果
- 是,舍去开头的字符并删除命令行上的最后一个引号字符,
- 保留最后一个引号字符之后的文字。
复制代码
看到了 确实如此
作者: 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://bathome.net./) |
Powered by Discuz! 7.2 |