Board logo

标题: [文件操作] BAT和VBS怎样批量对交换机进行不同配置? [打印本页]

作者: kuishilova    时间: 2015-1-31 15:17     标题: BAT和VBS怎样批量对交换机进行不同配置?

因为工作需要,需对大量交换机进行配置,比如我有二十台交换机,每一个交换机都需要一系列不一样的配置,我的思路是将这二十台交换机ip地址放入”ip.txt"当中,另外分别制作二十套具体的配置命令保存在一个txt文档里面并且用分隔符做成二十个段落,当执行批处理文件的时候每扫描一个ip之后读取指定的一段内容写入到临时的vbs文件当中、运行vbs脚本即可对该交换机进行配置,完成之后删除临时vbs脚本、扫描下一个ip,这个时候又从配置命令文档里面读取相应的段落写入临时vbs脚本文件、再执行,如此循环。或者我直接制作二十个vbs脚本,每扫描一个ip之后调用一个对应的vbs脚本文件进行执行。
我现在已经有一段代码(附在帖子最后),代码利用for循环实现对“ip.txt"文件当中的交换机列表按顺序读取,读取之后利用%%i变量将扫描到的ip以及对它的telnet命令写入临时vbs脚本实现telnet连接,另外制作交换机的具体配置命令保存在1.vbs当中,telnet连接交换机之后再调用这个脚本即可对交换机实现一系列的配置命令。但是这个小程序只能实现对列表当中的所有交换机进行相同的配置,而我现在需要对交换机进行不同配置
请大家帮忙,我应该怎样修改这个批处理程序才能实现我想要的功能?谢谢
  1. @echo off
  2.   :wait
  3.   set a=
  4.   set/p a=输入S开始配置:
  5.   if %a%==s goto :startconf
  6.   if %a%==q goto :end
  7.   goto :wait
  8.   :startconf
  9.   echo 交换机配置结果:>>配置结果.txt
  10.   for /f %%i in (ip.txt) do echo 正在扫描 %%i && echo 请等待........&& ping -n 1 -w 2 %%i -n 2|find "TTL">nul && echo 扫描%%i完成,正在执行配置工作... && echo set sh=WScript.CreateObject("WScript.Shell") >telnet_tmp.vbs && echo WScript.Sleep 300 >>telnet_tmp.vbs && echo sh.SendKeys "open %%i" >>telnet_tmp.vbs && echo WScript.Sleep 1000 …… && echo sh.SendKeys "{ENTER}">>telnet_tmp.vbs && echo WScript.Sleep 1000 ……&& start telnet && cscript //nologo telnet_tmp.vbs && cscript //nologo 1.vbs && del telnet_tmp.vbs && set /a count+=1 && echo %%i配置成功 && echo %%i配置成功>>配置结果.txt
  11.   
  12.   echo ----------------结果说明---------------
  13.   echo 配置完毕!
  14.   echo 共配置可以联通的交换机:%count%台。
  15.   echo 配置的结果保存在当前目录的“配置结果.txt”中。
  16.   echo ---------------------------------------
  17.   echo 按任意键返回主菜单
  18.   pause>nul
  19.   goto :wait
  20.   :end
复制代码

作者: pcl_test    时间: 2015-1-31 19:24

回复 1# kuishilova

1、临时vbs的代码一样吧,除了ip不同外?
2、把临时vbs的代码发出来
作者: kuishilova    时间: 2015-1-31 20:13

本帖最后由 kuishilova 于 2015-1-31 20:17 编辑

回复 2# pcl_test

临时的vbs脚本就是在我帖子最后贴出来的代码前面一半,后面的具体配置命令在1.vbs文件内,根据交换机不同,是不一样的,我的目的只是利用批处理调用它们,所以它们的具体内容是什么在这里不重要。
比如我这个代码里面,每次从IP.txt文档里读取一个ip(每个ip一行),就按顺序执行后面的脚本,最后调用“1.vbs”里面的脚本代码,这样的结果就是所有交换机都进行了相同的配置(即1.vbs文件里面的脚本),但我是希望实现读取第一个ip之后调用“1.vbs”,读取第二个ip之后调用“2.vbs”,第三个ip调用“3.vbs”.....这样一个循环。
作者: kuishilova    时间: 2015-1-31 20:16

回复 2# pcl_test
这一段就是临时的vbs代码,实现的是按顺序读取ip.txt文档内的每一个ip,然后用telnet连接。紧接着这段临时代码之后就是调用1.vbs,这个文件里面就是具体的交换机配置命令
  1. echo set sh=WScript.CreateObject("WScript.Shell") >telnet_tmp.vbs && echo WScript.Sleep 300 >>telnet_tmp.vbs && echo sh.SendKeys "open %%i" >>telnet_tmp.vbs && echo WScript.Sleep 1000 …… && echo sh.SendKeys "{ENTER}">>telnet_tmp.vbs && echo WScript.Sleep 1000 ……&& start telnet && cscript //nologo telnet_tmp.vbs
复制代码

作者: pcl_test    时间: 2015-1-31 20:33

回复 3# kuishilova
你没懂我问的意思,从你发的代码看,不知是不是你省略了一些字符,因为telnet_tmp.vbs的生成是有问题的,所以才问你要telnet_tmp.vbs的完整代码,至于1.vbs,自然是了解只是调用,所以我根本就没问它里面是什么内容
作者: kuishilova    时间: 2015-1-31 20:44

回复 5# pcl_test
临时脚本的代码内容就是这一段,没有问题的。这一段代码就是创建临时脚本telnet_tmp.vbs,它能实现的功能就是根据当前的循环变量%%i的变化,每次循环的时候把不同的ip地址写入telnet_tmp.vbs,最后执行telnet_tmp.vbs脚本就可以实现每次循环打开一个不同的ip地址。我原有的完整代码里面,紧接着telnet_tmp.vbs之后就是调用1.vbs。当1.vbs运行结束之后,删除telnet_tmp.vbs,然后进入下一次循环。我希望能做到的是,当进入下一次循环、执行telnet_tmp.vbs以后调用另外一个vbs。
  1. echo set sh=WScript.CreateObject("WScript.Shell") >telnet_tmp.vbs && echo WScript.Sleep 300 >>telnet_tmp.vbs && echo sh.SendKeys "open %%i" >>telnet_tmp.vbs && echo WScript.Sleep 1000 …… && echo sh.SendKeys "{ENTER}">>telnet_tmp.vbs && echo WScript.Sleep 1000 ……&& start telnet && cscript //nologo telnet_tmp.vbs
复制代码

作者: pcl_test    时间: 2015-1-31 20:51

本帖最后由 pcl_test 于 2015-1-31 20:55 编辑

回复 6# kuishilova
那就是省略了一些字符啦,因为你的代码最后一个“echo WScript.Sleep 1000 ”有什么用呢?
作者: kuishilova    时间: 2015-1-31 20:57

回复 7# pcl_test

没省略啊,这是个完整可以正确执行的代码。结果就是按顺序读取ip.txt文档当中的ip地址,然后telnet连接,最后按照1.vbs里面的脚本命令对交换机进行配置。
作者: pcl_test    时间: 2015-1-31 21:00

回复 8# kuishilova

你就单独把这段写进批处理运行下,看看生成的vbs有没缺失代码
  1. echo set sh=WScript.CreateObject("WScript.Shell") >telnet_tmp.vbs && echo WScript.Sleep 300 >>telnet_tmp.vbs && echo sh.SendKeys "open %%i" >>telnet_tmp.vbs && echo WScript.Sleep 1000 …… && echo sh.SendKeys "{ENTER}">>telnet_tmp.vbs && echo WScript.Sleep 1000 ……
复制代码

作者: kuishilova    时间: 2015-1-31 21:15

回复 9# pcl_test
  1. set sh=WScript.CreateObject("WScript.Shell")  
  2. WScript.Sleep 300  
  3. sh.SendKeys "open 192.255.64.132"  
  4. sh.SendKeys "{ENTER}"
复制代码
上面这就是临时vbs脚本生成的结果,其中192.255.64.132就是ip.txt文档当中的一条ip地址,每找到一条ip之后程序就会按照这样生成临时vbs并且运行,实现对不同ip的telnet连接,紧接着调用1.vbs里面的脚本进行交换机的配置。
兄弟!咱能不能不要纠结这段代码的运行结果是否正常啊?更何况这个代码没有问题啊,我正常运行了的,
我现在需要的是找到办法修改临时vbs运行以后的后半段代码,就是调用1.vbs的部分,使它能够实现随着前面变量的改变而选择调用不同的vbs脚本
作者: kuishilova    时间: 2015-1-31 21:21

回复 9# pcl_test
echo WScript.Sleep 1000这一句的目的是让它等待一秒钟,避免因为网络延迟或者系统延迟造成后面的命令无法正常执行。
作者: pcl_test    时间: 2015-1-31 21:22

回复 10# kuishilova
呵呵,其实你的问题很好解决,我跟你说的那些,都跟解决问题有关的
作者: kuishilova    时间: 2015-1-31 21:26

回复 12# pcl_test

好吧。。。。那能否请你直接说出解决办法啊?我找了很多资料都没有想出解决办法。
作者: pcl_test    时间: 2015-1-31 21:27

回复 11# kuishilova
那么为什么没在telnet_tmp.vbs生成?是否多余呢?
作者: kuishilova    时间: 2015-1-31 21:37

回复 14# pcl_test
1.vbs里面是一组配置命令,几十条不等。每一个ip都有不同的一组配置需求,所以我考虑的是针对性地制作若干组配置命令放进不同的vbs脚本(1.vbs、2.vbs、3.vbs、4.vbs。。。。。。),然后每扫描一个ip打开telnet以后就调用一个不同vbs脚本。至于这些脚本是否写入临时vbs里面都是一样的。
或者也可以把所有命令组放进一个txt文本文档里,使用字符串分隔开,然后通过批处理读取的时候选择性读取不同的段落,但我觉得那样可能更复杂,还不如调用不同的vbs脚本文件更简单。

兄弟,你能否直接说的答案啊?
作者: pcl_test    时间: 2015-1-31 22:30

本帖最后由 pcl_test 于 2015-1-31 22:34 编辑

回复 15# kuishilova
把1.vbs、2.vbs……以相应的ip重命名
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. color a
  4. :wait
  5. cls
  6. echo 1、进行配置
  7. echo 2、退出
  8. set a=0
  9. set/p a=请选择:
  10. if %a%==1 goto :startconf
  11. if %a%==2 exit
  12. goto :wait
  13. :startconf
  14. echo 交换机配置结果:>>配置结果.txt
  15. set count=0
  16. for /f "delims=" %%i in (ip.txt) do (
  17. set temp=0
  18. echo 正在扫描 %%i
  19. echo 请等待........
  20. ping -n 1 -w 2 %%i|find "TTL" >nul&&set temp=1
  21. if "!temp!" equ "1" (
  22. echo 扫描%%i完成,正在执行配置工作...
  23. >telnet_tmp.vbs echo set sh=WScript.CreateObject^("WScript.Shell"^)
  24. >>telnet_tmp.vbs echo WScript.Sleep 300
  25. >>telnet_tmp.vbs echo sh.SendKeys "open %%i"
  26. >>telnet_tmp.vbs echo WScript.Sleep 1000
  27. >>telnet_tmp.vbs echo sh.SendKeys "{ENTER}"
  28. >>telnet_tmp.vbs echo WScript.Sleep 1000
  29. start telnet
  30. ping -n 2 127.1 >nul
  31. cscript //nologo telnet_tmp.vbs
  32. ping -n 2 127.1 >nul
  33. cscript //nologo %%i.vbs
  34. del telnet_tmp.vbs
  35. set /a count+=1
  36. echo %%i配置成功
  37. echo %%i配置成功>>配置结果.txt
  38. ) else (
  39. echo %%i无法ping通!
  40. echo %%i配置失败>>配置结果.txt
  41. )
  42. )
  43. echo ----------------结果说明---------------
  44. echo 配置完毕!
  45. echo 共配置可以联通的交换机:%count%台。
  46. echo 配置的结果保存在当前目录的“配置结果.txt”中。
  47. echo ---------------------------------------
  48. echo 按任意键返回主菜单
  49. pause>nul
  50. goto :wait
复制代码

作者: kuishilova    时间: 2015-1-31 23:33

本帖最后由 kuishilova 于 2015-2-1 00:10 编辑

回复 16# pcl_test
多谢了!
可是,能否做到不使用相应的IP命名?或者再给我一个按顺序提取ip地址出来给vbs重命名的脚本?因为我有至少60ip地址在ip.txt文档内,也就是说我事先已经做好了60组vbs脚本命令,按照1.va、2.vbs、3.vbs。。。。。一直到60.vbs已经命名完成了。那么,如果要使用你之前帮我写出来的代码,那么我就必须要按顺序提取ip.txt文档里面的六十个ip地址作为文件名,一一对应地把六十个vbs文件重命名。
作者: kuishilova    时间: 2015-2-1 00:21

回复 16# pcl_test


    或者创建一个命令组的文本文档,内容为:
命令组1-----------------
第1行命令组1的内容
第2行命令组1的内容
。。。。
第n行命令组1的内容

命令组2-------------
第1行命令组2的内容
第2行命令组2的内容
。。。。
第n行命令组2的内容
。。。。。。

命令组x-------------
第1行命令组x的内容
第2行命令组x的内容
。。。。
第n行命令组x的内容

在批处理内增加一个计数器,每循环一次,就从命令组文档内提取对应的命令组的所有行,追加进入telnet_tmp.vbs,这样telnet_tmp.vbs就完成了所有的命令,它运行完成以后删除telnet_tmp.vbs,计数器接着就加一、进入下一次循环。我不知道这样做和之前的思路相比,是否跟更复杂?
作者: yiwuyun    时间: 2015-2-1 12:21

[code]
@echo off
setlocal EnableDelayedExpansion
  :wait
  set a=
  set/p a=输入S开始配置:
  if %a%==s goto :startconf
  if %a%==q goto :end
  goto :wait
  :startconf
  echo 交换机配置结果:>>配置结果.txt
  for /f %%i in (ip.txt) do echo 正在扫描 %%i && echo 请等待........&& ping -n 1 -w 2 %%i -n 2|find "TTL">nul && echo 扫描%%i完成,正在执行配置工作... && echo set sh=WScript.CreateObject("WScript.Shell") >telnet_tmp.vbs && echo WScript.Sleep 300 >>telnet_tmp.vbs && echo sh.SendKeys "open %%i" >>telnet_tmp.vbs && echo WScript.Sleep 1000 …… && echo sh.SendKeys "{ENTER}">>telnet_tmp.vbs && echo WScript.Sleep 1000 ……&& start telnet&& set /a count+=1  && cscript //nologo telnet_tmp.vbs && cscript //nologo !count!.vbs && del telnet_tmp.vbs && echo %%i配置成功 && echo %%i配置成功>>配置结果.txt
  
  echo ----------------结果说明---------------
  echo 配置完毕!
  echo 共配置可以联通的交换机:%count%台。
  echo 配置的结果保存在当前目录的“配置结果.txt”中。
  echo ---------------------------------------
  echo 按任意键返回主菜单
  pause>nul
  goto :wait
  :end
作者: pcl_test    时间: 2015-2-1 12:49

回复 17# kuishilova
重命名什么的很容易的,自己试着把重命名批处理写出来,不要总想着吃现成的
作者: terse    时间: 2015-2-1 13:26

回复 19# yiwuyun

开启延迟变量  这样能运行吗
  1. set /a count+=1
  2. cscript //nologo !count!.vbs
复制代码

作者: yiwuyun    时间: 2015-2-1 13:44

没试过,如果不能。那只有用call调用了。
set a=!count!.vbs
call :csc !a!
exit /b 0

:csc
cscript //nologo %1
exit /b 0

如果还不行,没法了。
作者: kuishilova    时间: 2015-2-1 22:52

重命名代码
  1. @echo on
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. for /f "delims=" %%a in ('dir /b *.vbs') do (
  5.     if !n! equ 0 (
  6.         set skip=
  7.     ) else (
  8.         set "skip=skip=!n!"
  9.     )
  10.     call :ChangeName "%%a" "!skip!"
  11.     set /a n+=1
  12. )
  13. goto :eof
  14. :ChangeName
  15. for /f "%~2 delims=" %%b in (ip.txt) do (
  16.     ren %1 "%%b.vbs"
  17.     goto :eof
  18. )
复制代码
回复 20# pcl_test
作者: kuishilova    时间: 2015-2-1 22:53

回复 19# yiwuyun
多谢!你这个延迟变量的代码,刚才试了一下,成功了一次,失败了一次,暂时没搞明白是哪里出了问题
作者: kuishilova    时间: 2015-2-2 10:21

回复 19# yiwuyun

昨天运行成功了,可是今天无论如何不行了,运行都第二个的时候就无法调用VBS




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