Board logo

标题: [网络连接] [已解决]用vbs编辑自动telnet批处理有没有等待字符返回的功能? [打印本页]

作者: htnet11    时间: 2009-4-16 09:48     标题: [已解决]用vbs编辑自动telnet批处理有没有等待字符返回的功能?

因为网络工程的实施过程中,需要对大量的设备进行配置,以及工程结束时对大量设备进行配置备份。因此想做一个批处理工具自动telnet。
目前,结合百度搜索的结果,已经完成了以下功能:、
1、通过bat文件自动生成vbs文件
2、运行vbs文件以后,自动telnet设备,并输入准备好的命令。可以配置,也可以备份配置。

代码如下:
1、bat文件的代码:
  1. @del .\temp.vbs
  2. @echo on error resume next >>.\temp.vbs
  3. @echo dim WshShell>>.\temp.vbs
  4. @echo Set WshShell = WScript.CreateObject("WScript.Shell")>>.\temp.vbs
  5. @echo WshShell.run"cmd">>.\temp.vbs
  6. @echo WshShell.AppActivate".\windows\system32\cmd.exe">>.\temp.vbs
  7. @echo WScript.Sleep 200>>.\temp.vbs
  8. @echo WshShell.SendKeys"telnet 192.168.1.2">>.\temp.vbs
  9. @echo WshShell.SendKeys"{ENTER}">>.\temp.vbs
  10. @echo WScript.Sleep 100>>.\temp.vbs
  11. @echo WshShell.AppActivate"telnet.exe ">>.\temp.vbs
  12. @echo WScript.Sleep 1000>>.\temp.vbs
  13. for /f "tokens=1 delims=" %%a in ('type .\input.txt') do (@echo WshShell.SendKeys"%%a" >>.\temp.vbs)&(@echo WshShell.SendKeys"{ENTER}">>.\temp.vbs)&(@echo WScript.Sleep 1000>>.\temp.vbs)
  14. @call .\temp.vbs>>.\temp1.txt
复制代码
2、生成的vbs的代码:
  1. on error resume next  
  2. dim WshShell
  3. Set WshShell = WScript.CreateObject("WScript.Shell")
  4. WshShell.run"cmd"
  5. WshShell.AppActivate".\windows\system32\cmd.exe"
  6. WScript.Sleep 200
  7. WshShell.SendKeys"telnet 192.168.1.2"
  8. WshShell.SendKeys"{ENTER}"
  9. WScript.Sleep 100
  10. WshShell.AppActivate"telnet.exe "
  11. WScript.Sleep 1000
  12. WshShell.SendKeys"cisco"
  13. WshShell.SendKeys"{ENTER}"
  14. WScript.Sleep 1000
  15. WshShell.SendKeys"en"
  16. WshShell.SendKeys"{ENTER}"
  17. WScript.Sleep 1000
  18. WshShell.SendKeys"cisco"
  19. WshShell.SendKeys"{ENTER}"
  20. WScript.Sleep 1000
  21. WshShell.SendKeys"show ip int br"
  22. WshShell.SendKeys"{ENTER}"
  23. WScript.Sleep 1000
  24. WshShell.SendKeys"conf t"
  25. WshShell.SendKeys"{ENTER}"
  26. WScript.Sleep 1000
  27. WshShell.SendKeys"exit"
  28. WshShell.SendKeys"{ENTER}"
  29. WScript.Sleep 1000
  30. WshShell.SendKeys"exit"
  31. WshShell.SendKeys"{ENTER}"
  32. WScript.Sleep 1000
复制代码
3、我测试用的txt文本
  1. cisco
  2. en
  3. cisco
  4. show ip int br
  5. conf t
  6. exit
  7. exit
复制代码
在使用时,只需要将txt文本拖动到bat文件的图标上即可。



遗留问题:
1、生成的vbs代码中,一个命令输出完以后无法根据网络设备返回的命令结果进行下一步配置,而是通过sleep的等待时间来进行下一步配置。这样对于某些需要执行很久的命令就不兼容。最好能有类似WaitForString或者Experts 之类的方法,等待返回结果后再输入下一个命令。
2、现有的vbs代码,无法记录整个批处理的执行过程。只能在结束后,通过tftp把配置文件考下来比对。不方便,也不放心。


希望大家能够帮忙解决。

[ 本帖最后由 htnet11 于 2009-4-21 18:08 编辑 ]
作者: htnet11    时间: 2009-4-16 11:42

没人么?自己顶一下?
作者: Batcher    时间: 2009-4-16 11:59

本版规则
1、求代码、寻求代码解释、探讨代码得失的帖子均可发在本版块,其余话题禁止在本版讨论;
2、求助时,务必在顶楼一次性把问题交代清楚;若文字难以表述,请配图说明,或是上传附件;但是,一切操作应从节约论坛资源的角度出发,能文字说明清楚的就无需再发图片,小图能说明问题的尽量不截全图,在不影响效果的前提下尽量压缩图片及附件;
3、所发代码若不止一行,请务必用code标记把代码部分首尾括起来,以便他人复制;


Q: 如何用code把代码扩起来?
A: http://bbs.bathome.net/thread-404-1-1.html
作者: htnet11    时间: 2009-4-16 13:48     标题: 啊,谢谢哦,我改了。这样应该没错了吧

啊,谢谢哦,我改了。这样应该没错了吧
作者: htnet11    时间: 2009-4-16 15:28

同志们帮帮忙啊,这个问题我想了很久了。解答出来也是造福大家啊
作者: htnet11    时间: 2009-4-21 15:55

看来这个问题是真搞不定了,
我后来从网上找了一个telnet程序 该程序提供了一个输入文件,和一个输出文件。我自己编制了一个自动按照要求语法生成输入文件的脚本。目前使用的挺好,如果谁想看看可以发纸条给我。

基本算是实现了不用sleep,而是等待屏幕返回结果后再输入下一跳,在一个星期的使用中没有出过问题。
作者: everest79    时间: 2009-4-21 18:53

vbs有个exec方法,可以得到命令行窗口的输入与输出,你可以使用这个方法启动然后得到返回信息来判段是否执行下一步
作者: Batcher    时间: 2009-4-21 19:04     标题: 回复 6楼 的帖子

你直接贴出来给大家分享一下不是更好吗?
^_^
作者: everest79    时间: 2009-4-22 21:03

我是知道这个实现方法,但没有具体应用过,所以也没代码
你可以查下wsh的wshscriptexec对象
此对象由wsh下的exec方法访问
  1. 在子命令外壳程序中运行应用程序,提供对 StdIn/StdOut/StdErr 流的访问
复制代码
具体的输入输出访问是其中三个属性
StdOut 属性 | StdIn 属性 | StdErr 属性
  1. Dim WshShell, oExec, input
  2. Set WshShell = CreateObject("WScript.Shell")
  3. Set oExec    = WshShell.Exec("test.bat")
  4. input = ""
  5. Do While True
  6.      If Not oExec.StdOut.AtEndOfStream Then
  7.           input = input & oExec.StdOut.Read(1)
  8.           If InStr(input, "Press any key") <> 0 Then Exit Do
  9.      End If
  10.      WScript.Sleep 100
  11. Loop
  12. oExec.StdIn.Write VbCrLf
  13. Do While oExec.Status <> 1
  14.      WScript.Sleep 100
  15. Loop
复制代码

作者: zqz0012005    时间: 2009-4-22 21:14     标题: 回复 9楼 的帖子

telnet似乎不是标准输出,exec的StdIn/StdOut得不到数据。
我上次在群里说过,可能大家没注意,现在还没找到解决办法。
各位有时间研究一下。
runas的输出也有点古怪(试试runas /? >a.txt),但exec的StdIn/StdOut可以访问。
作者: everest79    时间: 2009-4-22 21:38

先启动cmd,然后再加载telnet试试
作者: zqz0012005    时间: 2009-4-22 21:49

也试过,不行。
作者: peijunjie2000    时间: 2014-10-11 15:47

这么多年来,楼主的问题解决了吗,我也需要这个功能
作者: ttskying    时间: 2015-5-7 20:51

这么多年了,求楼主的实现方法,我有几百台这样的设备需要配置。这是要被弄死的节奏




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