发布新日志

  • 密码参数化情况

    2007-08-07 12:58:56

    密码输入有两种方式,一种改用Set方法,一种SetSecure方法

    用Set方法时直接输入密码就可以了

    如果用SetSecure方法,则需要将明文转换为经过加密后的字符串,具体用Crypt对象的Encrypt方法。

    比如密码是 mercury,用 Crypt.Encrypt("mercury") 可以得到一个值 "464d059be45f8d524b913574b017ed492a8b8d4b"

  • Wscript.Shell 对象详细介绍[ZT]

    2007-07-27 15:44:05

    Wscrīpt.Shell 对象详细介绍

    WshShell 对象
    ProgID Wscrīpt.Shell
    文件名 WSHom.Ocx
    CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B
    IID F935DC21-1CF0-11d0-ADB9-00C04FD58A0B


    下表说明和 WshShell 对象有关的属性。

    属性 说明
    Environment 返回 WshEnvironment 集合对象。
    SpecialFolders 使用 WshSpecialFolders 对象提供对 Windows shell 文件夹的访问,如桌面文件夹,开始菜单文件夹和个人文档文件夹。


    下表说明和 WshShell 对象有关的方法。

    方法 说明
    CreateShortcut 创建并返回 WshShortcut 对象。
    ExpandEnvironmentStrings 扩展 PROCESS 环境变量并返回结果字符串。
    Popup 显示包含指定消息的消息窗口。
    RegDelete 从注册表中删除指定的键或值。
    RegRead 从注册表中返回指定的键或值。
    RegWrite 在注册表中设置指定的键或值。
    Run 创建新的进程,该进程用指定的窗口样式执行指定的命令。


    WshShell.Environment
    Environment 属性返回 WshEnvironment 对象。

    语法
    WshShell.Environment ( [strType]) = objWshEnvironment

    注释
    若 strType 指定了环境变量所处的位置,可能值为 \"System\"、\"User\"、\"Volatile\" 和 \"Process\"。若未提供 strType,则该方法在 Windows NT 中检索系统环境变量或在 Windows 95 中检索进程环境变量。

    对于 Windows 95,strType 参数仅支持 \"Process\"。

    下列变量是由 Windows 操作系统提供的。脚本也可获取由其他应用程序设置的环境变量。

    名称 说明
    NUMBER_OF_PROCESSORS 计算机上运行的处理器数目。
    PROCESSOR_ARCHITECTURE 用户工作站使用的处理器类型。
    PROCESSOR_IDENTIFIER 用户工作站的处理器 ID。
    PROCESSOR_LEVEL 用户工作站的处理器级。
    PROCESSOR_REVISION 用户工作站的处理器版本。
    OS 用户工作站所用的操作系统。
    COMSPEC 用于运行“命令提示”窗口的命令(通常为 cmd.exe)。
    HOMEDRIVE 本地主驱动器(通常为 C 驱动器)。
    HOMEPATH 用户的默认路径(在 Windows NT 上通常为 \\users\\default)。
    PATH 路径环境变量。
    PATHEXT 可执行文件的扩展名(通常为 .com、 .exe、.bat 或 .cmd)。
    PROMPT 命令提示符(通常为 $P$G)。
    SYSTEMDRIVE 系统所在的本地驱动器(例如,c:\\)。
    SYSTEMROOT 系统目录(例如,c:\\winnt)。和 WINDIR 相同。
    WINDIR 系统目录(例如 c:\\winnt)。和 SYSTEMROOT 相同。
    TEMP 存储临时文件的目录(例如,c:\\temp)。用户可更改。
    TMP 存储临时文件的目录(例如,c:\\temp)。用户可更改。


    示例
    \' Retrieve the NUMBER_OF_PROCESSORS system environment variable
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    Set WshSysEnv = WshShell.Environment(\"SYSTEM\")
    Wscrīpt.Echo WshSysEnv(\"NUMBER_OF_PROCESSORS\")

    请参阅
    WshEnvironment 对象


    WshEnvironment 对象
    WshEnvironment 对象未直接给出,可用 WshShell.Environment 属性来访问。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID


    下表描述与 WshEnvironment 对象关联的属性。

    属性 说明
    Item 获取或设置指定的环境变量值。
    Count 枚举项的数目。
    length 枚举项的数目 (Jscrīpt)。


    下表描述与 WshEnvironment 对象关联的方法。

    方法 说明
    Remove 删除指定的环境变量。


    WshShell.SpecialFolders
    SpecialFolders 属性提供 WshSpecialFolders 对象以便访问 Windows 的 shell 文件夹,例如桌面文件夹、开始菜单文件夹和个人文档文件夹。

    语法
    WshShell.SpecialFolders = objWshSpecialFolders

    示例
    \' This code fragment shows how to access the desktop folder
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    MsgBox \"Your desktop is \" & WshShell.SpecialFolders(\"Desktop\")
    请参阅
    WshSpecialFolders 对象

    WshSpecialFolders 对象
    该对象未直接给出。要得到 WshSpecialFolders 对象,请使用 WshShell.SpecialFolders 属性。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID


    下表描述与 WshSpecialFolders 对象关联的属性。

    属性 描述
    Item 指定文件夹的完整路径(默认)。
    Count 枚举项的数目。
    length 枚举项的数目 (Jscrīpt) 。

    WshSpecialFolders.Item
    Item 属性返回由 strFolderName 指定的文件夹的完整路径。它是默认属性。

    语法
    WshShell.SpecialFolders.Item(\"strFolderName\") = strFolderPath
    WshShell.SpecialFolders(\"strFolderName\") = strFolderPath

    注释
    若请求的文件夹 (strFolderName) 不可用,则 WshShell.SpecialFolders(\"strFolderName\") 返回 NULL。例如,Windows 95 没有 AllUsersDesktop 文件夹,如果 strFolderName = AllUsersDesktop,则返回 NULL。

    Windows 95 和 Windows NT 4.0 操作系统提供下列指定文件夹:
    AllUsersDesktop
    AllUsersStartMenu

    AllUsersPrograms

    AllUsersStartup

    Desktop

    Favorites

    Fonts

    MyDocuments

    NetHood

    PrintHood

    Programs

    Recent

    SendTo

    StartMenu

    Startup

    Templates

    示例
    \' This fragment returns the full path for the Windows Desktop folder
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    StrMyDesktop = WshShell.SpecialFolders(\"Desktop\")

    \' List all special folders
    For Each strFolder In WshShell.SpecialFolders
    MsgBox strFolder
    Next

    请参阅
    WshShell.SpecialFolders 属性


    WshShell.CreateShortcut
    CreateShortcut 方法创建 WshShortcut 对象并将其返回。如果快捷方式标题以 .url 结尾,就会创建 WshURLShortcut 对象。

    语法
    WshShell.CreateShortcut(strPathname) = objShortcut

    示例
    \' This code fragment creates a shortcut
    \' to the currently executing scrīpt
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    Set ōShellLink = WshShell.CreateShortcut(\"Current scrīpt.lnk\")
    oShellLink.TargetPath = Wscrīpt.scrīptFullName
    oShellLink.Save
    Set ōUrlLink = WshShell.CreateShortcut(\"Microsoft Web Site.URL\")
    oUrlLink.TargetPath = \"http://www.microsoft.com\"
    oUrlLink.Save

    请参阅
    WshShortcut 对象、WshUrlShortcut 对象

    WshShortcut 对象
    该对象未直接给出。要获得 WshShortcut 对象,请使用 WshShell.CreateShortcut 方法。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID F935DC28-1CF0-11d0-ADB9-00C04FD58A0B
    IID F935DC27-1CF0-11d0-ADB9-00C04FD58A0B


    下表说明和 WshShortcut 对象有关的属性。

    属性 说明
    Arguments 快捷方式对象的参数。
    Descrīption 快捷方式对象的说明。
    Hotkey 快捷方式对象的热键。
    IconLocation 快捷方式对象的图标位置。
    TargetPath 快捷方式对象的目标路径。
    WindowStyle 快捷方式对象的窗口样式。
    WorkingDirectory 快捷方式对象的工作目录。


    下表说明与 WshShortcut 对象有关的方法。

    方法 说明
    Save 将快捷方式存储到指定的文件系统中。

    WshShortcut.Arguments
    Arguments 属性提供快捷方式对象的参数。

    语法
    WshShortcut.Arguments = strArguments

    WshShortcut.Descrīption
    Descrīption 属性提供快捷方式对象的说明。

    语法
    WshShortcut.Descrīption = strDescrīption

    WshShortcut.Hotkey
    HotKey 属性提供快捷方式对象的热键。热键是启动或切换程序的键盘快捷方式。

    语法
    WshShortcut.HotKey = strHotKey

    注释
    strHotKey 的BNF语法如下:

    Hotkey ::= modifier* keyname
    modifier ::= \"ALT+\" │ \"CTRL+\" │ \"SHIFT+\" │ \"EXT+\"
    keyname ::= \"A\" .. \"Z\" │
    \"0\".. \"9\" │
    \"Back\" │ \"Tab\" │ \"Clear\" │ \"Return\" │
    \"Escape\" │ \"Space\" │ \"Prior\" │ ...

    所有键的名称都可以在 WINUSER.H 中找到。热键不区分大小写。

    热键只能激活位于 Windows 桌面或 Windows“开始”菜单的快捷方式。

    Windows 资源管理器不接受 ESC、ENTER、TAB、SPACE、PRINT SCREEN 或 BACKSPACE,即使 WshShortcut.Hotkey 遵循 Win32 API 支持它们。因此,建议在快捷方式中不要用这些键。

    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.WshShell\")
    strDesktop = WshShell.SpecialFolders(\"Desktop\")
    Set ōMyShortcut = WshShell.CreateShortcut(strDesktop & \"\\a_key.lnk\")
    OMyShortcut.TargetPath = \"%windir%\\notepad.exe\"
    oMyShortCut.Hotkey = \"ALT+CTRL+F\"
    oMyShortCut.Save
    Wscrīpt.Echo oMyShortCut.HotKey = \"Alt+Ctrl+F\"

    请参阅
    WshSpecialFolders 对象

    WshShortcut.IconLocation
    IconLocation 属性提供快捷方式对象的图标位置。图标位置的格式应为 \"Path,index\"。

    语法
    WshShortcut.IconLocation = strIconLocation

    WshShortcut.TargetPath
    TargetPath 属性提供快捷方式对象的目标路径。

    语法
    WshShortcut.TargetPath = strTargetPath

    WshShortcut.WindowStyle
    WindowStyle 属性提供快捷方式对象的窗口样式。

    语法
    WshShortcut.WindowStyle = natWindowStyle

    WshShortcut.WorkingDirectory
    WorkingDirectory 为一个快捷方式对象提供工作目录。

    语法
    WshShortcut.WorkingDirectory = strWorkingDirectory

    WshShortcut.Save
    Save 方法把快捷方式对象保存到由 FullName 属性指定的位置。

    语法
    WshShortcut.Save

    WshUrlShortcut 对象
    该对象未直接给出。要获取 WshUrlShortcut 对象,可使用 WshShell.CreateShortcut 方法。

    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID


    下表说明了和 WshUrlShortcut 对象有关的属性。

    属性 说明
    FullName URL 快捷方式对象的完整路径。
    TargetPath URL 快捷方式对象的目标路径。


    下表说明了和 WshUrlShortcut 对象有关的方法。

    方法 说明
    Save 将快捷方式保存到指定的文件系统中。

    WshUrlShortcut.FullName
    FullName 属性提供快捷方式对象的完整路径。

    语法
    WshUrlShortcut.FullName = strFullName

    WshUrlShortcut.TargetPath
    TargetPath 属性提供快捷方式对象的目标路径。

    语法
    WshUrlShortcut.TargetPath = strTargetPath

    WshUrlShortcut.Save
    Save 方法保存一个快捷方式,该快捷方式指向 FullName 属性指定的位置。

    语法
    WshUrlShortcut.Save

    WshShell.ExpandEnvironmentStrings
    ExpandEnvironmentStrings 方法在 strString 中扩展 PROCESS 环境变量并返回结果字符串。变量被 \'%\' 字符括起。

    环境变量不区分大小写。

    语法
    WshShell.ExpandEnvironmentStrings(strString) = strExpandedString

    示例
    MsgBox \"Prompt is \" & WshShell.ExpandEnviromentStrings(\"%PROMPT%\")

     

    WshShell.Popup
    Popup 方法显示一个弹出式消息框窗口,消息框中包含的消息由 strText 指定。该消息框的窗口标题由 strTitle 指定。若 strTitle 省略,则窗口标题为 Windows scrīpting Host。

    语法
    WshShell.Popup(strText, [natSecondsToWait], [strTitle], [natType]) = intButton

    注释
    若提供 natSecondsToWait 且其值大于零,则消息框在 natSecondsToWait 秒后关闭。

    natType 的含义与其在 Win32? MessageBox 函数中相同。下表显示 natType 中的值及含义。下表中的值可以组合。

    按钮类型
    值 说明
    0 显示“确定”按钮
    1 显示“确定”和“取消”按钮
    2 显示“终止”、“重试”和“忽略”按钮
    3 显示“是”、“否”和“取消”按钮
    4 显示“是”和“否”按钮
    5 显示“重试”和“取消”按钮


    图标类型
    值 说明
    16 显示停止标记图标
    32 显示问号图标
    48 显示感叹号图标
    64 显示信息标记图标


    以上两个表并不涵盖 natType 的所有值。完整的列表请参阅 Win32 文档。

    返回值 intButton 指示用户所单击的按扭编号。若用户在 natSecondsToWait 秒之前不单击按扭,则 intButton 设置为 -1 。

    值 说明
    1 “确定”按扭
    2 “取消”按扭
    3 “终止”按扭
    4 “重试”按扭
    5 “忽略”按扭
    6 “是”按扭
    7 “否”按扭


    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    WshShell.Popup \"Where do you want to go today?\"

    请参阅
    Wscrīpt.Echo 方法

    Wscrīpt.Echo
    Echo 方法在窗口(Wscrīpt.exe 中)或“命令提示符”窗口(Cscrīpt.exe 中)显示参数。

    参数用空格分隔。在 Cscrīpt.exe 中,该方法在显示最后一个参数之后输出一对回车/换行(CR LF)。

    语法
    Wscrīpt.Echo [anyArg...]

    示例
    Wscrīpt.Echo
    Wscrīpt.Echo 1, 2, 3
    Wscrīpt.Echo \"Windows scrīpting Host is cool.\"

    WshShell.RegDelete
    RegDelete 从注册表中删除名为 strName 的键或值。

    语法
    WshShell.RegDelete strName

    参数
    strName
    如果 strName 以反斜杠 (\\) 结束,则该方法删除键而不是值。
    strName 参数必须以下列之一的根键名开始:

    短根键名 长根键名
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG


    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    WshShell.RegDelete \"HKCU\\scrīptEngine\\Value\" \' Delete value \"Value\"
    WshShell.RegDelete \"HKCU\\scrīptEngine\\Key\\\" \' Delete key \"Key\"

    请参阅
    WshShell.RegRead 方法、WshShell.RegWrite 方法


    WshShell.RegRead
    RegRead 方法返回名为 strName 的注册表键或值。

    语法
    WshShell.RegRead(strName) = strValue

    参数
    strName
    如果 strName 以反斜杠 (\\) 结束,则该方法返回键,而不是值。
    strName 参数必须以下列根键名开始。

    Short Long
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG


    注释
    RegRead 方法仅支持 REG_SZ、REG_EXPAND_SZ、REG_DWORD、REG_BINARY 和 REG_MULTI_SZ 数据类型。若注册表有其他数据类型,RegRead 返回 DISP_E_TYPEMISMATCH。

    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    WshShell.RegRead(\"HKCU\\scrīptEngine\\Val\") \' Read from value \"Val\"
    WshShell.RegRead(\"HKCU\\scrīptEngine\\Key\\\") \' Read from key \"Key\"

    请参阅
    WshShell.RegDelete 方法、WshShell.RegWrite 方法


    WshShell.RegWrite
    RegWrite 方法设置名为 strName 的注册表键或值。

    语法
    WshShell.RegWrite strName, anyValue, [strType]

    参数
    strName
    若 strName 以一个反斜杠 (\\) 结束,则该方法设置键,而不是值。
    strName 参数必须以下列根键名开头。

    Short Long
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG

     

    anyValue
    当 strType 为 REG_SZ 或 REG_EXPAND_SZ 时,RegWrite 方法自动将 anyValue 转换为字符串。若 strType 为 REG_DWORD,则 anyValue 被转换为整数。若 strType 为 REG_BINARY,则 anyValue 必须是一个整数。

    strType
    RegWrite 方法支持 strType 为 REG_SZ、REG_EXPAND_SZ、REG_DWORD 和 REG_BINARY。若其他的数据类型被作为 strType 传递,RegWrite 返回 E_INVALIDARG。
    示例
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")

    WshShell.RegWrite \"HKCU\\scrīptEngine\\Value\", \"Some string value\"
    WshShell.RegWrite \"HKCU\\scrīptEngine\\Key\\\", 1 \"REG_DWORD\"

    请参阅
    WshShell.RegDelete 方法、WshShell.RegWrite方法


    WshShell.Run
    Run 方法创建一个新的进程,该进程以 intWindowStyle 窗口样式执行 strCommand。

    语法
    WshShell.Run (strCommand, [intWindowStyle], [blnWaitOnReturn])

    参数
    strCommand
    在 strCommand 参数内部的环境变量被自动扩展。

    intWindowStyle
    这是为新进程在 STARTUPINFO 结构内设置的 wShowWindow 元素的值。其意义与 ShowWindow 中的 nCmdShow 参数相同,可取以下值之一。名称 值 含义
    SW_HIDE
    0 隐藏窗口并激活另一窗口。
    SW_MINIMIZE
    6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
    SW_RESTORE
    9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。
    SW_SHOW
    5 以当前大小和位置激活并显示窗口。
    SW_SHOWMAXIMIZED
    3 激活窗口并以最大化显示该窗口。
    SW_SHOWMINIMIZED
    2 激活窗口并以最小化显示该窗口。
    SW_SHOWMINNOACTIVE
    7 最小化显示窗口。活动窗口保持活动。
    SW_SHOWNA
    8 以当前状态显示窗口。活动窗口保持活动。
    SW_SHOWNOACTIVATE
    4 按窗口最近的大小和位置显示。活动窗口保持活动。
    SW_SHOWNORMAL
    1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。

     

    blnWaitOnReturn
    如果未指定 blnWaitOnReturn 或其值为 FALSE,则该方法立即返回到脚本继续执行而不等待进程结束。
    若 blnWaitOnReturn 设为 TRUE,则 Run 方法返回由应用程序返回的任何错误代码。如果未指定 blnWaitOnReturn 或其值为 FALSE,则 Run 返回错误代码 0(zero)。

    示例
    \' This fragment launches Notepad with the current executed scrīpt
    Set WshShell = Wscrīpt.CreateObject(\"Wscrīpt.Shell\")
    WshShell.Run (\"notepad \" & Wscrīpt.scrīptFullName)
    WshShell.Run (\"%windir%\\notepad\" & Wscrīpt.scrīptFullName)

    \' This fragment returns the error code from the executed application
    Return = WshShell.Run(\"notepad \" & Wscrīpt.scrīptFullName, 1, TRUE)

  • 关于窗口最大化最小化问题

    2007-07-19 17:19:48

    对于IE浏览器,可以很简单的用FullScreen方法,Browser("****").FullScreen即可
    对于windows对象,可以直接用Maximize方法,Window("****").Maximize即可

    对于在回放过程中将QTP最小化的方法
    Dim objQTP
    set ōbjQTP = GetObject("","QuickTest.Application")
    objQTP.windowState = "Minimized"
    objQTP.WindowState = "Restored" '还原窗口
    set ōbjQTP = nothing '释放资源

  • 获取EXCEL文件的行数

    2007-05-17 17:02:41

    类似DATATABLE的GETROWCOUNT方法

    Set xlapp = Createobject("excel.application")
    Set wkBook = xlapp.Workbooks.Open("c:\aa.xls")
    Set wksheeta = wkBook.Worksheets("sheet1")
    n=wksheeta.UsedRange.Cells.Rows.Count
    msgbox "n="&n
    wkbook.save
    wkbook.close
    xlapp.quit
    set xlapp = nothing

    有点烦,换不换工作的问题。现在工作地方的环境还是不错,但这个项目做完后就去做其他工作,非测试方面的,所以有点想换个地方。软中,虽然谈的差不多了,但不想去了,待遇也不比这好多少,上班还要跑那么远。还有个地方在等,明天没消息就差不多没希望了。

    不知不觉的就浪费了很多,很清楚在做些什么,但就是改不了,依然那样

  • [zt]解决AJAX写的控件不能录制方法

    2007-04-30 10:18:14

    Tools --> Web Event Recording Configuration, 把 Event configuration level 的设置从默认的 Basic  改为Medium ,然后 关闭QTP,重新录制你的脚本就可以了。

    http://www.microsoft.com/china/technet/archives/columns/scrīpts/sg1002.asp

    [code]

    让我们立即着手编写一个示例脚本。事实上,我们应该在编写脚本之前,先确保具备一个用来保存这个脚本的物理位置。如果在您所使用的计算机上并不存在一个名为C:\scrīpts的文件夹,就请返回根目录,并新建这个文件夹。当您完成上述工作后,应打开记事本或其它文本编辑器,并键入以下脚本代码,然后,使用RunIPConfig.vbs文件名将其保存至您的C:\scrīpts文件夹。

    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Run “ipconfig”
    

    在尝试运行刚刚生成的脚本之前,让我们先对其进行检查,并设法事先指出可能产生的运行结果。在这个脚本中存在着两个有助于我们预测运行结果的暗示。第一行代码中包括动词Create(生成,实际上是CreateObject),而第二行代码则包含动词Run(运行)。可见,这个脚本将有可能先生成某种被称作对象的东西,并随后运行某一特定程序。事实上,情况看上去更象是该脚本将运行一个文件名为ipconfig.exe的命令行工具。

    以上预测的确与该脚本所产生的运行结果相符。该脚本首先生成一种被称作对象的东西。在这个示例中,脚本所生成的对象是Shell(WshShell)对象。您可将某一对象理解成类似于命令行工具的东西;而您的脚本则可借助它执行某一特定类型的任务。Shell对象将允许您从脚本中执行原本可在Windows命令解释程序内执行的任务--就像运行程序一样。

    与命令行工具不同的是,您必须在开始对其加以应用之前,先行生成一个新对象。当生成该对象时,还应为它指定一个将在脚本其余部分中被用来对它进行引用的名称。在这个示例中,我们所使用的名称是objShell。当对象生成完毕并被赋予相关名称后,我们便可利用该对象执行相关任务,具体方法为:在对象名后加上一个圆点(.),并在圆点后加上所需完成的任务名称。这个例子中的任务名是Run。而Run则是众所周知的Shell对象方法。

    现在,请打开一个命令行窗体,并导航至C:\scrīpts文件夹。如需运行您刚刚编写的脚本,则请输入cscrīpt RunIPConfig.vbs命令,并按回车键。您将看到一个窗体在屏幕上一闪而过,但该窗体所显示的内容却在您能够看清之前消失了!您可反复尝试运行该脚本,并试图破解消失在窗体中的信息。这也许是一件饶有兴味的事,但却可通过一种更加简便的方法完成。

    为了便于您进行理解,我们必须针对在您运行命令行工具的同时所发生的事件给予关注。当您在命令行方式下输入ipconfig、并在键盘上敲击回车键时,便对命令解释程序发出了一个指令。而命令解释程序则将对您所输入的指令进行检查。如果您所输入的命令代表着一个有效程序,那么,命令解释程序便会为您运行该程序。如果您所输入的命令并不代表有效程序,那么,命令解释程序则将通过显示错误信息的方式就有关情况向您进行告知。基于Windows NT操作系统的命令解释程序是Cmd.exe。而Windows 9x操作系统中的命令解释程序则是Command.exe。

    此时此刻,上述脚本中的objShell.Run “ipconfig”命令将在其运行ipconfig程序的同时绕过命令解释程序;换句话说,该命令将在无须先运行命令解释程序再由命令解释程序运行ipconfig的前提下直接运行ipconfig。在某些情况下,这种方式或许利大于弊,但在这个示例中,我们却不希望绕过命令解释程序。为什么?因为命令解释程序可帮助我们发现“窗体一闪而过”问题的答案。正如您所看到的,命令解释程序可接受大量开关选项(如果您有兴趣了解cmd.exe或command.exe所具备的全部功能,则请在计算机帮助系统中查找该程序的可执行文件),而这些选项中的/k开关则恰恰用来指示命令解释程序在某一程序运行完毕后保持输出窗口的开启状态。我们需要借助这个选项来确保程序窗体不会在打开后立即关闭。

    为实现上述目的,我们应将正在运行的命令从ipconfig修改为cmd.exe /k ipconfig或command.exe /k ipconfig,这里,cmd.exe对应于Windows NT操作系统,而command.exe则适用于Windows 9x操作系统。但是,如果您必须同时面向Windows NT和Windows 9x操作系统提供支持,又将如之奈何?针对我们正在使用的操作系统进行跟踪的确是一件颇为麻烦的事。也正是出于这种原因,我们才引用了一个名为%COMSPEC%的环境变量,以期提供通往适当命令解释程序的完整路径。该环境变量可确保下列脚本代码既可在Windows NT操作系统上运行,又能在Windows 9x操作系统上执行:

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    objShell.Run "%COMSPEC% /k ipconfig"
    

    请尝试运行这个经过修改的脚本。您只需启动记事本(或其它习惯使用的文件编辑器),并将%COMSPEC% /k添加到先前编写的脚本中,然后,将修改过的文件另存为RunIPConfig.vbs。接下来,在命令行窗体中导航至C:\scrīpts目录,再通过输入cscrīpt RunIPConfig.vbs命令并按回车键的方法运行该脚本。您这次将看到一个用来显示ipconfig命令输出结果的新窗体,具体情形如下图所示。


    如果您所使用的浏览器无法支持嵌入式框架,请, 点击此处 以便在单独页面中进行浏览。

    您接下来应该做的就是进行适用性测验。上述脚本所能运行的程序绝不仅限于ipconfig。而您所需要完成的全部工作仅仅是修改第二行代码中跟在Run方法后面的字符串。您可尝试将%COMSPEC% /k ipconfig分别替换为%COMSPEC% /k netstat或%COMSPEC% /k mmc。举例来说,您将可从某一脚本中运行GUI(图形用户界面)工具,而这个脚本则以运行计算器程序为例:

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    objShell.Run "Calc.exe"
    

    您不仅能从某一脚本内部运行其它脚本,而且,还可从当前脚本中调用其它批处理文件;如果您碰巧拥有一些批处理文件,不妨尝试运行它们。当然,如果这些批处理文件的存储位置与您计算机上PATH环境变量的设定范围并不相符,您就应将相关存储位置添加到全局访问路径或单独指定通往批处理脚本的完整访问路径。举例来说,如果您在C:\Batchscrīpts目录下拥有一个名为Checkserver.bat的批处理脚本,那么,应由您传递给Run方法的字符串就应类似于:%COMSPEC% /k C:\batchscrīpts\checkserver.bat。

    如果您已完成了上述试验,我们就将继续讲解后面的内容。您将学习到借助Run方法运行单一程序的具体方法。如果您需要连续运行两个程序,应如何是好?这恰恰是由下列脚本即将执行的任务:该脚本将在运行ping程序后,紧接着运行nslookup程序。请注意,您可将对应于所需运行程序的命令行参数包含在传递给Run方法的字符串当中。在此,我们将把127.0.0.1作为参数分别传递给Ping和Nslookup。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    objShell.Run "%COMSPEC% /k ping 127.0.0.1"
    objShell.Run "%COMSPEC% /k nslookup 127.0.0.1"
    

    请按针对先前所述脚本的处理方法保存并运行这个脚本。脚本运行结果应该是两个命令行窗体同时打开,其中,Nslookup程序在一个窗体中运行,而Ping程序则在另一个窗体中以同步方式运行,具体情形正如以下屏幕快照所示。


    如果您所使用的浏览器无法支持嵌入式框架,请, 点击此处 以便在单独页面中进行浏览。

    在这个例子中,事实表明,实现Ping和Nslookup的同时运行根本不成问题。然而,如果您需要运行两个批处理脚本,并希望在第一个脚本运行完毕后再开始运行第二个脚本,又该如何是好?举例来说,第一个程序将针对某一特定类型的信息执行检索,并将其保存为一个文本文件;而第二个程序则将在前者基础上通读刚刚生成的文本文件,并针对相关内容执行特定操作。在这种情况下,两个程序的同时运行将是无法接受时;只有在第一个程序执行完毕的前提下,第二个程序才能开始运行。

    到目前为止,我们一直都在传递给Run方法一个用来指定所需运行程序的字符串。Run方法将可再接收两个参数,而这两个参数中的每一个均为可选参数。第二个参数将允许您针对某一程序在开始运行时所呈现的窗体外观加以指定。并非所有程序都将使用到该参数,但对于那些使用该参数的程序来说,该参数却可帮助您启动一个呈现多种窗体风格(包括最小化、最大化和隐藏在内)的程序。我们并不打算在这篇专栏文章中过多涉及该参数。如果您需要了解有关该参数的更多信息资料,敬请查阅WSH在线文档http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28001169(点击接近本页面顶部的“Windows scrīpt Host文档”链接)。

    专供Run方法接收的第三个参数将允许我们防止相关程序以并发方式运行。您可将第三个参数赋值为True,以便指示脚本停留在使用Run方法的代码行并保持等待状态,直到已被激活的程序运行完毕。我们已经知道了因未设定该参数所产生的后果,该参数在缺省状态下被设定为False,而这种设置必将导致两个程序同时运行。

    让我们将前面的脚本修改为先运行Ping程序,待Ping程序运行完毕后,再运行Nslookup程序的状态。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    objShell.Run "%COMSPEC% /k ping 127.0.0.1",,True
    objShell.Run "%COMSPEC% /k nslookup 127.0.0.1"
    

    请注意,我们已将被赋值为True的第三个参数添加到应在脚本第二行中被调用的Run方法之后。我们之所以连续使用两个逗号的原因在于,如果我们只使用一个逗号,那么,Run方法便会认为我们随后指定的是第二个参数,而非第三个参数。如您所见,两个连续逗号之间并不存在任何内容,因此,也就不会有任何设置被当作第二个参数传递给Run方法。如果我们没有对某一参数专门赋值,那么,Run方法便会使用缺省值。举例来说,第三个参数的缺省值应该是False。

    现在就让我们试着运行经过修改的脚本。您会马上注意到,只有Ping程序得到运行。当Ping运行完毕后,该程序运行时所使用的窗体仍在屏幕上保持开启状态;而Nslookup程序则尚未开始运行。请试着关闭这个窗体并查看接下来发生的情况。当您关闭Ping程序所使用的窗体后,Nslookup便会开始运行。请记住,您正在使用/k选项运行cmd.exe(或command.exe),也就是说,您已经告诉Run方法,直到cmd.exe运行完毕,方可继续执行后续指令。好的,由于我们事先设定了/k选项,因此,只有曾被要求保持开启状态的窗体得到关闭,cmd.exe才会执行完毕。

    如果您需要运行两个批处理文件,并且无需查看它们的输出结果,那么,便可将/k选项删除,而这两个批处理文件仍将接续(而非同时)运行,这也恰恰是您在第二个程序信赖第一个程序运行结果的前提下所需确保的运行方式。

    两个程序之间应就以下信息进行沟通,那就是,第一个程序实现运行的情况必须被告知第二个程序。某些程序将返回一个错误代码(也就是一个数字),用来指示自身是否已得到成功运行。而Run方法便可将这种错误代码返回给您所编写的脚本。正处于运行状态的程序必须在得知即将被返回的错误代码之前运行完毕,为此,您必须通过将Run方法的第三个参数设定为True的方式强制脚本等候程序运行完毕。

    我们将在接下来的脚本中运行Ping程序,并通过针对Wscrīpt对象使用Echo命令的方式将该程序所返回的错误代码显示出来。Wscrīpt对象将不必被生成为类似于WshShell对象的状况,而您则可在脚本当中的任意控制点对它所提供的方法加以运用。

    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    iErrorCode = objShell.Run(“ping 127.0.0.1”,,True)
    Wscrīpt.Echo iErrorCode 
    

    除具备错误代码检索功能外,以上脚本还在两方面与先前脚本有所区别。首先,请注意,即将被传递给Run方法的字符串已被加上了一对圆括号。这主要是因为,Run目前被要求返回一个数值。这属于VBscrīpt语言的一项要求;如果您并未在此使用圆括号,便会在脚本运行过程中收到一条错误信息。应该被返回的数值是Ping程序的错误代码,并将被保存至变量iErrorCode,然后,借助Wscrīpt.Echo命令被显示出来。

    需要给予关注的第二件事就是,我们并没有运行命令解释程序。我们希望错误代码来自Ping,而非来自Cmd.exe(或Command.exe),为此,我们直接运行了Ping程序。而由Ping返回的错误代码既不是很有趣,也不是很有用。当然,某些命令行工具却可返回可供您所编写的脚本做出相关判断(或生成日志)的有用错误代码。

    从借助Run实现运行的某一程序中所获得的相关信息仅能满足最低使用需求,并很有可能不具备多少使用价值。举例来说,许多程序都将只返回一个0数值,以此表明自身已实现运行并且运行完毕。当然,它们并没有必要就自身成功运行且运行完毕的情况向您进行汇报。

    当然,如果您已拥有WSH 5.6版(可从http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28001169页面下载),便具备了另一种可供使用的方法,以便运行那些可帮助您与当前所运行程序改善信息交流方式的程序。而这种方法便是Exec。它还是从属于WshShell对象的一种方法,这里所说的WshShell正是为使用Run而必须生成的那个对象。这对我们来说主要意味着,不必为开始利用Exec方法而针对脚本的第一行代码进行修改。

    让我们直接编写一个利用Exec方法运行ipconfig程序的脚本。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    objShell.Exec "%COMSPEC% /k ipconfig"
    

    上述脚本同我们为您展示的第二个脚本之间所存在的唯一区别就是,我们已在这个脚本中将objShell.Run修改为objShell.Exec。然而,当您运行这一个脚本时,将难以觉察到上述修改所产生的效果。您甚至无法看到那个一闪即逝的窗体。实际上,您根本看不到任何东西。如果我们此时告诉您,ipconfig实际上已运行完毕,不知您是否愿意相信?好吧,还是不要轻易相信我们所说的话;取而代之的做法是,在ipconfig命令后方添加一个重定向符号(>),并在针对ipconfig发出的调用后紧跟一个文本文件名。上述代码将导致命令执行结果被输出到指定文件。如果您尚未习惯使用重定向操作,不妨这样设想:如果我们将真实情况告诉您,而ipconfig程序的确处于运行状态,那么,它便会生成自己的标准文本显示信息。遗憾的是,我们将无法看到相关信息。重定向操作将允许我们捕捉到任何命令的输出结果,并将它们强行导向一个指定文件。这将有助于我们针对ipconfig命令是否处于运行状态加以确认。接下来的脚本可供用来将所需查看的输出结果呈现给我们。

    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Exec “%COMSPEC% /k ipconfig > ipconfig_output.txt”
    

    在上述脚本运行完毕后,请查看ipconfig_output.txt文件内容。如需查看这个文本文件的内容,则请按下列屏幕快照所示键入type命令。


    如果您所使用的浏览器无法支持嵌入式框架,请, 点击此处 以便在单独页面中进行浏览。

    这就是您所得到的信息!我们的脚本就是实实在在地运行ipconfig,只不过没有让我们看到命令输出结果。无论您相信与否,这都算得上一件好事。Exec之所以没有为我们显示输出结果,恰恰是因为我们原本并未提出相关要求。正如您所看到的那样,我们可借助Exec针对输出结果的呈现和操作方式加以控制。

    您是否还记得令Run方法返回错误代码的具体实现方式?Exec事实上可返回一个被称作WshscrīptExec的完整对象。正如WshShell对象为我们提供针对Run和Exec这两种方法的访问调用权限那样,WshscrīptExec对象将为我们提供针对附加功能特性的访问调用权限,而这些附加功能特性则允许我们围绕某一程序的输出结果展开操作。脚本中大量操作的实现都会以额外复杂性为代价,而上述附加功能特性也不例外。我们即将或多或少地遭遇这种复杂性,为此,请继续阅读本文,并在接下来的章节中确保集中精力。

    Exec方法可供用来返回一个WshscrīptExec对象。而在某一脚本中促成这一事件的发生则需要使用VBscrīpt语言中的Set关键字,具体代码如下所示:

    Set ōbjWshShellExec = objShell.Exec(“ipconfig”)
    

    说明:我们并未在此继续使用%COMSPEC%环境变量;该变量已不具备继续存在的必要,其原因主要体现为,我们不需要为确保某一并不存在的窗体处于开启状态而将/k选项传递给相关命令。那么,我们又该如何将这个窗体关闭并继续运行脚本代码呢?我们将可在此使用/c选项(该选项表示只运行一条命令,然后,接着执行后续代码);事实上,如果我们需要运行一条已被内建于命令解释程序的命令(例如dir),便会需要使用该选项。而像dir这样的工具本身并不属于工具范畴;它们更加近似于cmd.exe(或command.exe)命令的参数;正因如此,您才需要为确保它们发挥作用而指定%COMSPEC%这一环境变量。

    当您将与WshShellExec对象相关的引用存储于objWshShellExec变量后,便已具备了开始围绕程序输出结果展开操作的必要条件,但此时的条件尚不够充分。而这正是复杂性乘虚而入的大好时机。正如Exec方法返回WshShellExec对象那样,WshShellExec对象亦可返回另一对象;这个对象将通过调用StdOut属性的方式被返回,而这恰恰允许您针对程序输出结果执行相关操作。

    如果不对照一个示例脚本,上述思路几乎不可能得到理解。为此,我们专门编写了一个最为简单的示例,旨在针对由嵌套于WSH脚本的某一程序所产生的输出结果加以运用。请将该脚本当作一种特殊类型的重定向操作。只有在这种情况下,程序输出结果才不会被导入某一文件,取而代之的是,相关输出结果将被赋予一个名为strOutput的变量。遗憾的是,我们这回将不能仅仅使用一个简单的重定向符号(>),而必须围绕两个不同对象执行操作。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    Set ōbjWshscrīptExec = objShell.Exec("ipconfig")
    Set ōbjStdOut = objWshscrīptExec.StdOut
    strOutput = objStdOut.ReadAll
    Wscrīpt.Echo strOutput
    

    由上述脚本生成的输出结果将被显示在专供脚本运行的窗体内;这里并没有新的窗体生成。事实上,如果您从命令行方式中运行ipconfig本身的话,输出结果看上去也将别无二帜。既然如此,为何不干脆采取这种方式?我们已经在脚本当中为输出结果生成了一个中间存储位置--strOutput变量。尽管我们将在上述脚本的下一行内利用Wscrīpt.Echo命令针对输出结果加以显示,然而,却往往需要在执行显示操作前先对输出结果实施操控,只有这样,才能对由ipconfig工具显示的信息进行修改。

    在尝试运行上述脚本之前,让我们先对它的最后三行代码给予更多关注;当然,您已经对前两行代码非常熟悉了。在第三行代码中,WshscrīptExec对象所配备的StdOut属性将被用来检索代表正处于运行状态之程序(标准)输出结果的相关对象;而ipconfig则是本例中待处理结果的输出程序。在第四行代码中,ReadAll方法将被用来针对全部输出结果执行检索,并将其保存于strOutput变量。最后,也就是在第五行代码中,Wscrīpt.Echo将被用来显示输出结果。

    我们现在已拥有了经常被当作ipconfig工具(或可供我们用来在上述脚本中替代ipconfig的其它任何工具)封装程序的对象。封装程序是一种可就另一程序功能特性加以应用、并能够以简便快捷方式针对已被封装程序功能进行修改的特殊程序。封装程序为我们创造了针对已被封装程序的输出结果进行修改的理想时机。而这恰恰是我们将利用本文剩余篇幅加以介绍的内容。

    在围绕ipconfig工具开展自定义的过程中,我们将需要了解以每次一行的频率对程序输出结果进行相关处理的具体方法。当前,我们主要借助objStdOut.ReadAll对ipconfig工具的全部输出结果执行检索操作,并将检索结果保存于strOutput变量。而我们将在下一个脚本中执行的任务则是利用ReadLine(而非ReadAll)针对输出结果进行逐行检索。我们将对输出结果的每一行进行检查,如果任意一行包括“Physical Address”(物理地址)字符串,就会将它显示出来;否则,便不会显示这行输出结果。我们只对包含“Physical Address”(物理地址,也就是对应于网卡的MAC地址)字符串的输出结果行执行了筛选操作,并未将其它任何内容显示出来。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    Set ōbjWshscrīptExec = objShell.Exec("ipconfig /all")
    Set ōbjStdOut = objWshscrīptExec.StdOut
    
    While Not objStdOut.AtEndOfStream
       strLine = objStdOut.ReadLine
       If InStr(strLine,"Physical Address") Then
           Wscrīpt.Echo strLine
       End If
    Wend
    

    上述脚本的前三行看上去多少有些眼熟;请注意,我们必须将/all选项添加至ipconfig命令后方,以确保Physical Address(物理地址)被显示出来。这个脚本同上个脚本之间的主要区别在于,前者使用了While/Wend循环语句。我们将使用ReadLine方法对单个输出结果行执行检索操作,但却需要掌握针对是否超出行检索范围的状态加以判定的具体手段。而这恰恰是While/Wend循环和objStdOut.AtEndOfStream指令的用武之地。只要程序尚未触及(标准)输出结果数据流的结尾,上述循环便会保持接续执行状态(而符合检索条件的输出结果行则将被保存至strLine变量)。您可将一个数据流想象为由一系列字符排列而成的长串,而您则可按排列顺序对其进行相关处理;本例中的数据流便是ipconfig /all命令的完整输出结果。

    每当我们完成一次程序循环时,便会将下一行内容保存至strLine变量,并利用If/Then语句决定是否应对该行内容加以显示。我们主要借助InStr(字符串命令)功能对存储在strLine变量当中的输出结果行是否包含“Physical Address”(物理地址)加以判断。如果当前行确实包含有“Physical Address”(物理地址),就应使用Wscrīpt.Echo命令将它显示出来。以下屏幕快照展现了由脚本生成的部分典型输出结果。


    如果您所使用的浏览器无法支持嵌入式框架,请, 点击此处 以便在单独页面中进行浏览。

    我们的下一个脚本将使用与上一个脚本完全相同的基本组件,所不同的是,我们已不再针对输出结果执行筛选操作,而是向它们当中添加特定内容。鉴于ipconfig /all命令可针对DHCP释放获取时机及其超时状态信息执行检索,因此,将当前日期和时间包含于命令输出结果的处理方法或许具备一定实用价值。接下来的脚本正是用来实现这一设想。

    脚本一开始便针对输出结果的前四行执行检索和显示操作,并且对每一行所采取的方法完全相同--先调用ReadLine命令,紧接着调用Wscrīpt.Echo命令。当输出结果的第四行已被检索并显示出来后,我们便生成了一个包含有当前日期和时间标注信息的字符串。而这里所说的当前日期和时间则是由VBscrīpt所配备的Now()函数提供的。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    Set ōbjWshscrīptExec = objShell.Exec("ipconfig /all")
    Set ōbjStdOut = objWshscrīptExec.StdOut
    
    '
    ' Skip first four lines
    '
    strLine = objStdOut.ReadLine
    Wscrīpt.Echo strLine 
    strLine = objStdOut.ReadLine
    Wscrīpt.Echo strLine
    strLine = objStdOut.ReadLine
    Wscrīpt.Echo strLine
    strLine = objStdOut.ReadLine
    Wscrīpt.Echo strLine
    
    '
    ' Add date/time information
    '
    
    strCurrentTime = "   Current Date/Time. . . . . . . . .: " & Now()
    Wscrīpt.Echo strCurrentTime
    
    '
    ' Display the rest of the output
    '
    
    While Not objStdOut.AtEndOfStream
       strLine = objStdOut.ReadLine
       Wscrīpt.Echo strLine
    Wend
    

    毋庸置疑,上述脚本已开始变得多少有些复杂了。而解读这一脚本的最佳方法则是逐段分析。您应对该脚本的前三行较为熟悉。而下一个附有注释的部分则主要借助ReadLine和Echo命令对ipconfig /all输出结果的前四行执行读取和显示操作。

    附有注释的下一部分自然以编排将被临时存储于strCurrentTime变量的新信息行为起点。这个信息行将由一个与VBscrīpt Now()函数调用操作相关联的简单字符串构成,而VBscrīpt Now()函数则用来提供当前日期和时间信息。一旦这个信息行编排完毕并被保存于strCurrentTime变量,我们便可当即使用Wscrīpt.Echo命令对其加以显示。

    在最后一个附有注释的部分中,我们将对输出结果的剩余内容执行循环操作,并在无需进行任何修改的前提下对其进行逐行显示。以下屏幕快照展现了脚本运行产生的典型输出结果。请注意,脚本输出结果看上去与ipconfig的标准输出结果别无二帜。而由我们插入Host Name(主机名称)行下方的Current Date/Time(当前日期/时间)行则与全新的上下文环境结合得天衣无缝。


    如果您所使用的浏览器无法支持嵌入式框架,请, 点击此处 以便在单独页面中进行浏览。

    最后,让我们使用For/Next循环语句执行前四行内容的输出操作,以便使脚本变得更加精简,具体代码如下所示。

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    Set ōbjWshscrīptExec = objShell.Exec("ipconfig /all")
    Set ōbjStdOut = objWshscrīptExec.StdOut
    
    '
    ' Skip first four lines
    '
    For i = 1 To 4
       strLine = objStdOut.ReadLine
       Wscrīpt.Echo strLine
    Next 
    
    '
    ' Add date/time information
    '
    
    strCurrentTime = "   Current Date/Time. . . . . . . . .: " & Now()
    Wscrīpt.Echo strCurrentTime
    
    '
    ' Display the rest of the output
    '
    
    While Not objStdOut.AtEndOfStream
       strLine = objStdOut.ReadLine
       Wscrīpt.Echo strLine
    Wend
    

    事实上,还存在着从WSH脚本中运行其它程序的另一种替代方法:即针对Windows管理规范(WMI)加以应用。您将可借助WMI完成一系列Windows管理任务!虽然借助WMI实现程序运行的方式将涉及相对复杂的语法,但却可帮助您完成Run和Exec无法实现的任务,例如,设定程序运行优先级或基于远程计算机运行相关程序。在此,我们诚恳地建议您尽可能了解有关WMI的更多信息资料。如果您确实对此抱有兴趣(我们希望您能够这样),则请到MSDN网站上一个名为scrīpting Clinic(脚本诊所)的专栏中查阅由三部分组成的系列文章(http://msdn.microsoft.com/columns)。

    好在我们已回答了您针对从WSH脚本中运行其它程序而产生的某些疑难问题。我们还为您提供了有关Run和Exec方法的简要概述,并初步涉及了存在于两者之间的某些差异--其中,最明显的区别体现为,Exec方法将允许您针对程序输出结果进行处理,而Run方法则不具备这种能力。另一个重要区别是:只有WSH 5.6及其后续版本方可提供Exec方法。

    [/code]

  • Shell里的两种运行模式

    2007-04-26 13:47:55

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    myrun = objShell.Run("ping 127.0.0.1",,True) ‘1
    myrun = objShell.Run("ping 127.0.0.2",,True) ‘2

    Set ōbjshell = nothing

    Set ōbjShell = CreateObject("Wscrīpt.Shell")
    myrun = objShell.Run("ping 127.0.0.1") ‘3
    myrun = objShell.Run("ping 127.0.0.2") ‘4

    Set ōbjshell = nothing

    这两种是有差别的,上面的方法等第一句执行完了才执行第二句,能够看到其执行步骤,而不是一闪就过,下面的这种方法同时执行这两句命令,一闪即过

    WshShell.SendKeys "^(ec)" 与 WshShell.SendKeys "^ec"的区别,后者表示组合按键是同时按住CtrlE键,然后松开Ctrl键,单独按下“C”字母键;前者表示按下CTRL的同时按下E、C键

  • [ZT]VBScript中SendKeys的妙用

    2007-04-20 12:42:40

    [quote]

    什么是VBscrīpt呢?

    VBscrīpt的全称是:Microsoft Visual Basic scrīpt Editon.(微软公司可视化BASIC脚本版). VBS(VBscrīpt的进一步简写)是基于Visual Basic的脚本语言,其不编译成二进制文件, 而是直接由宿主(host)解释源代码并执行, 简单点说就是你写的程序不需要编译成.exe, 而是直接给用户发送.vbs的源程序, 用户就能执行了.

    SendKeys 方法

    模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行, 
    其使用格式为:object.SendKeys(string) 

    “object”:表示WshShell对象 
    “string”:表示要发送的按键指令字符串,需要放在英文双引号中。

    -----------------------------------
    1.基本键 

      一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“ WshShell.SendKeys "happy" ”。

    2.特殊功能键 

      对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: 

      Shift---------WshShell.SendKeys "+" 
      Ctrl---------WshShell.SendKeys "^" 
      Alt---------WshShell.SendKeys "%"  (注意   这样使用时,不用大括号括起这些特殊字符。)
      由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 

    另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。
    例如要发送回车键,需要用“ WshShell.SendKeys "{ENTER}" ”表示;
    发送向下的方向键用“ Wshell.SendKeys "{DOWN}" ”表示。 

    Space---------WshShell.SendKeys " " 
    Enter---------WshShell.SendKeys "{ENTER}" 
    ←---------WshShell.SendKeys "{RIGHT}" 
    ↑---------WshShell.SendKeys "{UP}" 
    F1---------WshShell.SendKeys "{F1}" 

    按键                代码    
    BACKSPACE     {BACKSPACE}, {BS}, 或 {BKSP}    
    BREAK         {BREAK}    
    CAPS LOCK     {CAPSLOCK}    
    DEL or Delete {Delete} 或 {DEL}    
    DOWN ARROW    {DOWN}    
    END           {END}    
    ENTER         {ENTER}或 ~    
    ESC           {ESC}    
    HELP          {HELP}    
    HOME          {HOME}    
    INS or Insert {Insert} 或 {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}

    Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    -----------------------------------
    按下F5刷新桌面 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "{F5}" 
    ---------------------------------------------------- 
    电脑的自动重启 

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^{ESC}u" 
    WshShell.SendKeys "R" 
    ---------------------------------------------------- 
    启动任务管理器 

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^+{ESC}" 
    ---------------------------------------------------- 
    QQ消息连发 

    Dim WshShell 
    Set WshShell= Wscrīpt.createObject("Wscrīpt.Shell") 
    WshShell.AppActivate "bomb" 
    for i=1 to 60 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "What do you say" 
    WshShell.SendKeys i 
    WshShell.SendKeys "%s" 
    next 
    ---------------------------------------------------- 
    自动到百度搜索歌曲:white flag 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run("IEXPLORE.EXE") 
    Wscrīpt.Sleep 2000 
    WshShell.AppActivate "about:blank-Microsoft Internet Explorer" 
    WshShell.SendKeys "+{TAB}" 
    WshShell.SendKeys "http://mp3.baidu.com
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    Wscrīpt.Sleep 3000 
    WshShell.SendKeys "white flag" 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    ---------------------------------------------------- 
    自动关机

    Dim WshShell
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell")
    Wscrīpt.Sleep 2000
    WshShell.Run "shutdown -r -t 120"
    wscrīpt.sleep 6000
    WshShell.Run "shutdown -a"
    ---------------------------------------------------- 
    在记事本中输入Happy Birthday!并保存为birth.txt 

    Dim WshShell 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run "notepad" 
    Wscrīpt.Sleep 1500 
    WshShell.AppActivate "无标题 - 记事本" 
    WshShell.SendKeys "H" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys " " 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "B" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "d" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "!" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FS" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "b" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%S" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FX" 
    ---------------------------------------------------- 
    制作能自动定时存盘的记事本 

    '第一部分:定义变量和对象 

    Dim WshShell, AutoSaveTime, TXTFileName 
    AutoSaveTime=300000 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    TXTFileName=InputBox("请输入你要创建的文件名(不能用中文和纯数字):") 

    '第二部分:打开并激活记事本 

    WshShell.Run "notepad" 
    Wscrīpt.Sleep 200 
    WshShell.AppActivate "无标题 - 记事本" 

    '第三部分:用输入的文件名存盘 

    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys TXTFileName 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys "%s" 
    Wscrīpt.Sleep AutoSaveTime 
    '第四部分:自动定时存盘 
    While WshShell.AppActivate (TXTFileName)=True 
    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep AutoSaveTime 
    Wend 
    Wscrīpt.Quit 

    ---------------------------------------------------- 

    自动死机o(∩_∩)o...

    DIM WSHSHELL 
    SET WSHSHELL=Wscrīpt.CreateOBJECT("Wscrīpt.SHELL") 
    'WSHSHELL.RUN " " 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 

    [/quote]

  • 通过日期控件录入日期问题

    2007-04-17 16:26:29

    通过日期控件选择日期,很多情况无法录入所选择的日期,导致回放失败,可以用下面的方法处理

    先把显示日期的文本框添加到对象库,假设是WebEdit类型的文本框sdate,对象整体路径:browser().page()...WebEdit("sdate")可做如下操作
    sd = browser().page()...WebEdit("sdate").object
    object.value = "2007-01-03"  也可直接赋值 browser().page()...WebEdit("sdate").object.value = "2007-01-03",输入正确日期格式的日期,再回放时就能正确显示所设置的日期了

  • 连接数据库

    2007-04-16 21:55:06

    dim cnn,rst,strcnn,strsql
    set cnn = createobject("adodb.connection")
    set rst = createobject("adodb.recordset")
    strcnn = "数据库连接字符串"
    cnn.open = strcnn
    strsql = "select * from table_a"
    rst.open strsql,strcnn,2,2 //参数为1,3时可用RECORDCOUNT取到记录总数,为2时返回-1
    msgbox rst("abc")  //取查询到的结果,字段名为abc的值,或第2列的值,第一列的index为0
    msgbox rst(2)
    rst.close
    cnn.close
    set rst = nothing
    set cnn = nothing

    Dim res,cmd,sql
    Set res = createobject("adodb.recordset")
    Set cmd = createobject("adodb.command")cmd.activeconnection="数据库连接字符串"
    cmd.CommandType = 1
    sql = "select max(order_number) as a from orders"
    cmd.CommandText = sqlSet
    res = cmd.execute()
    Set res = nothingSet
    cmd.ActiveConnection = nothing
    Set cmd = nothing

    数据库连接字符串可以建立UDL文件来获得

  • 测试前预处理

    2007-04-16 12:32:40

    Option Explicit
    Dim loginwin,child,i
    Set loginwin=descrīption.Create()
    loginwin("application version").value="internet explorer 6"   '所有页面的application version属性值都是internet explorer 6,也可以用其他属性
    Set child=desktop.ChildObjects(loginwin)
    msgbox child.count
    For i=1 to child.count
            child(i-1).close
    Next
  • 退出循环

    2007-04-16 10:18:27

    ExitTest -退出整个TEST。
    ExitAction - 退出当前操作,无论其循环属性如何。
    ExitActionIteration - 退出操作的当前循环
    ExitRun - 退出测试,无论其循环属性如何。
    ExitGlobalIteration - 退出当前全局循环

    定位XLS文件中的单元格可以直接用CELL方法
    定位GlobalSheet,或Action表中的单元格可以这样
    先用setcurrentrow方法定位行,再用datatable.RawValue(i,"Action1")方法定位列  i可以是列名,也可以是列号,例第一列,i可以是A也可以是1,是A时需加双引号,Action1是表名

  • 一些鼠标相关事件

    2007-04-05 10:21:50

    右键双击事件
    object.FireEvent "ondblclick",,, 11
    注解:FireEvent "ondblclick",,, 11
    object.FireEvent EventName, [x], [y], [BUTTON]
    BUTTON是可选的. 可以定义为常量或者数字.
    关于常量的描述:
    0 是鼠标左键  
    1是右键
    2是中间键
     
    tool->web event recording configration相关设置
    用object spy看菜单下选项的属性里按住ctrl键选择,否则选不上,不能查看
    tools -> web event recording configuration 点击custom settings... 展开Web objects,选种webelement,点击event -> add -> onmouseover
  • 比较同一个XLS文件里的两张表,然后COPY过去

    2007-04-04 15:24:44

    Set xlapp = Createobject("excel.application")
    Set wkBook = xlapp.Workbooks.Open("e:\bb.xls")
    Set wksheeta = wkBook.Worksheets("sheet1")
    Set wksheetb = wkBook.Worksheets("sheet2")
    j = 444
    for a = 2 to 176 '从第二行开始比较
      for b = 2 to 442
        if wksheeta.cells(a,2) = wksheetb.cells(b,2) then
     if wksheeta.cells(a,2)<>wksheeta.cells(a-1,2) then
       for c = 1 to 7
         wksheetb.cells(b,c) = wksheeta.cells(a,c)
       next
     else
       for c = 1 to 7
         wksheetb.cells(j,c) = wksheeta.cells(a,c)
       next
       j = j + 1
     end if
        end if
      next
    next
    wkbook.save
    wkbook.close
    xlapp.quit
    set xlapp = nothing
  • 录制网页URL地址发生变化

    2007-04-04 11:29:55

    Test-->Record and Run Setting-->在Address里输入新的URL,然后在Test-->Update Run...-->Update Options-->勾选Update test object descrīptions,之后QTP会自动Run一遍,成功之后会弹出一个Run report,这时可以看到有关以前的IP都改过来了。
  • 回车键操作

    2007-04-04 10:37:14

    object.FireEvent("onfocus") '获焦
    set WshShell =CreateObject("Wscrīpt.Shell")
    WshShell.SendKeys "{ENTER}"

我的栏目

数据统计

  • 访问量: 10953
  • 日志数: 17
  • 文件数: 1
  • 建立时间: 2007-01-27
  • 更新时间: 2007-10-24

RSS订阅

Open Toolbar