我们知道batch Telnet是批处理Telnet的意思。在自动化工程中,常会设计这方面问题。那么现在我们就来对这些问题进行一下研究。其中我们提供了两种方法实现这个目标,那么具体的操作请从正文来了解一下吧。
两种办法可以实现bat转换为EXE
有两种办法可以实现bat转换为EXE,一种是利用工具,如DOS下的bat2exe工具;另一种方法是在VB中使用Shell函数,其形式如下(结束后DOS窗口会自行关闭):
- Shell "command.com /c copy c:\1.txt a:\",vbNormalFocus
如何在批处理中运行Telnet自动任务?
一般来说ftp做batch处理事务时非常常见的事情。那么如果Batch Telnet,让我们的管理工作更加的轻松呢?
一般来说两种方法:
1、VBS法(Windows Script Host)
2、自动终端法(一些可以配置自动Telnet的终端)
在这里我们讨论第一种方法:VBS法。由于Windows Script Host是系统自带的,我们不需要安装地方放软件就可以搞定。所以它一般是解决问题的首选。
首先,我们建立一个名字叫做tel.vbs的脚本,这里用Telnet 到cisco路由器上作为一个例子,相关内容大家可以修改。
- ’建立Shell对象
- set sh=WScript.CreateObject("WScript.Shell")
- WScript.Sleep 1000
- ’向Telnet发送我们平时录入的命令
- sh.SendKeys "open 192.168.1.1"
- WScript.Sleep 1000
- sh.SendKeys "{ENTER}"
- WScript.Sleep 1000
- sh.SendKeys "password{ENTER}"
- WScript.Sleep 1000
- sh.SendKeys "en{ENTER}"
- WScript.Sleep 1000
- sh.SendKeys "passord{ENTER}"
- WScript.Sleep 1000
- ’运行cisco的show run命令
- sh.SendKeys "show run{ENTER}"
然后,建立一个batch_tel.bat的批处理文件:
- rem 启动Telnet
- start Telnet.exe
- rem batch Telnet
- cscript //nologo tel.vbs
最后,我们只需要运行batch_tel.bat就可以轻松搞定Telnet的工作了。
对于SendKeys这个命令可以send什么,我们可以看下面的列表:#p#
- BACKSPACE {BACKSPACE}, {BS}, or {BKSP}
- BREAK {BREAK}
- CAPS LOCK {CAPSLOCK}
- DEL ;or DELETE {DELETE} or {DEL}
- DOWN ARROW {DOWN}
- END {END}
- ENTER {ENTER}or ~
- ESC {ESC}
- HELP {HELP}
- HOME {HOME}
- INS or INSERT {INSERT} or {INS}
- LEFT ARROW {LEFT}
- NUM LOCK {NUMLOCK}
- PAGE DOWN {PGDN}
- PAGE UP {PGUP}
- PRINT SCREEN {PRTSC}
- RIGHT ARROW {RIGHT}
- SCROLL LOCK {SCROLLLOCK}
- TAB {TAB}
- UP ARROW {UP}
- F1 {F1}
- F2 {F2}
- F3 {F3}
- F4 {F4}
- F5 {F5}
- F6 {F6}
- F7 {F7}
- F8 {F8}
- F9 {F9}
- F10 {F10}
- F11 {F11}
- F12 {F12}
- F13 {F13}
- F14 {F14}
- F15 {F15}
- F16 {F16}
- SHIFT +
- CTRL ^
- ALT %
Shell一个应用程序并等待该程序执行完毕后继续运行
Shell & Wait 的程序怎么写? 希望某一 VB 程序利用 Shell 执行某一个外部程序(假设是 notepad.exe)之后, 就一直等到此一程序结束执行时, 才回到 VB 程序继续执行, 该怎么办到呢? 当我们调用 Shell 时, 会传回一个数值, 此一数值称为 Process Id, 利用此 一 Process Id, 我们可以调用 OpenProcess API 取得 Process Handle, 然后 再利用 Process Handle 调用 WaitForSingleObject, 即可等待被 Shell 执行的 程序执行完毕, 才继续向下执行。细节如下:
1. API 的声明:
- Const SYNCHRONIZE = &H100000
- Const INFINITE = &HFFFFFFFF
- Private Declare Function OpenProcess Lib "kernel32" (ByVal
- dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId
- As Long) As Long
- Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
- Long) As Long
- Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal
- hHandle As Long, ByVal dwMilliseconds As Long) As Long
注:如果以上的声明放在「一般模块」底下, 应将 Declare 之前的 Private 保 留字去掉, 并且在 Const 之前加上 Public 保留字。
2. 程序范例:(以执行 Notepad 程序为例)
- Dim pId As Long, pHnd As Long ’分别声明 Process Id 及 Process Handle 变 数
- pId = Shell("Notepad", vbNormalFocus) ’Shell 传回
- Process Id pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ’ 取得 Process Handle
- If pHnd <> 0 Then Call WaitForSingleObject(pHnd, INFINITE) ’ 无限等待,直到程序结束
- Call CloseHandle(pHnd)
- End If
DPG联盟 http://www.xhstudio.net