批处理实现多线程执行命令列表
工作中碰到多线程执行命令列表的情况,研究一番,编写出来与大家分享。高手看了也请指点,指教一些更简单的办法。
批处理是一种单线程的简单脚本,只有上条命令执行完后,才能执行下条命令。如果上条命令执行花费很长时间,如超时,连接失败不断尝试等,下一条命令头发白了,可能还等不到它执行。
百度问答上找到一个方法可以实现多线程,原理:利用bat调用bat来实现多线程。
例如:网管希望同时ping局域中所有主机,实现方法如下。
首先,建立两个批处理文件;
1.bat文件代码如下:
for /l %%i in (2,1,10) do start 2.bat 192.168.0.%%i
2.bat文件代码如下:
ping %1 -n 10
运行1.bat后,1.bat调用2.bat,可以实现多线程。测试时可以看到屏幕上刷的出现了一大片的窗口,每个窗口都独立运行。
实现了多线程的目标了,下面解决执行命令列表。举个探测端口的例子。网管希望多线程同时执行端口验证的命令。
把要命令都存放在文件cmdlist.txt中
cmdlist.txt文件代码如下:
telnet 10.1.1.1 22
telnet 10.1.1.1 80
telnet 10.1.1.1 443
telnet 10.1.1.1 8080
多线程需要的2个bat ,内容如下:
1.bat文件代码如下:
for /l %%i in (1,1,4) do start 2.bat %%i
::一个for循环,从1到4,10是cmdlist.txt中命令的行数,步长为1,调用2.bat,传递参数%%i。 %%i是指cmdlist.txt中命令的序号。不懂的童鞋自己找资料。
2.bat文件代码如下:
@echo off ::关闭回显
setlocal enabledelayedexpansion ::变量延迟
for /f "tokens=*" %%i in (cmdlist.txt) do (
set /a n+=1 ::设置自变量表达式
if "!n!"=="%1" echo %%i|cmd ::执行第%%i行命令
)
批处理语言可读性比较差,问了一些朋友,他们建议用VBS脚本来编写。
如果工作中碰到类似的需求,只要把上面代码稍加修改就可以用了。