Board logo

标题: [技术讨论] vbs中的"Wscript.Shell"[属性与方法] [打印本页]

作者: czjt1234    时间: 2012-10-18 09:29     标题: vbs中的"Wscript.Shell"[属性与方法]

Wscript.Shell 创建 WshShell 对象,提供对本地 Windows 外壳程序的访问


属性
CurrentDirectory         返回或设置当前目录
Environment              环境变量。返回 WshEnvironment 对象
SpecialFolders           特殊文件夹。返回 WshSpecialFolders 对象



方法
AppActivate              激活指定窗口
CreateShortcut           创建或打开快捷方式。返回 WshShortcut 对象或 WshUrlShortcut 对象
Exec                     运行程序。返回 WshScriptExec 对象
ExpandEnvironmentStrings 返回环境变量的值
LogEvent                 添加"应用程序"日志
Popup                    弹出对话框
RegDelete                删除指定的注册表项目
RegRead                  读取指定的注册表项目
RegWrite                 新建或修改指定的注册表项目
Run                      运行程序。可返回一个整数值
SendKeys                 将一个或多个键击发送到活动窗口(仿佛是在键盘上击键一样)



WshShell 对象及其属性、方法,都可以在 Script5.6.chm 里找到参考

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

WshShell 对象的属性和方法,创建了
WshEnvironment    对象
WshScriptExec     对象
WshShortcut       对象
WshSpecialFolders 对象
WshUrlShortcut    对象

作者: czjt1234    时间: 2012-10-18 09:32

本帖最后由 czjt1234 于 2012-10-18 14:15 编辑

下面是 WshShell 对象的属性和方法的参数,及用法举例

代码测试环境:winxpsp3 IE8 Wscript版本5.7.0.18066

'-------------------------------------------------------------

Dim objWsh, intNumber, strRead, objExec
Dim objWshEnv, objWshSpe, objLink, objUrlLink, objWshExec


set objWsh = CreateObject("Wscript.Shell")
'返回 WshShell 对象


'-------------------------------------------------------------

objwsh.AppActivate "Title"|ProcessID         '激活指定窗口,可以是标题栏或进程ID

strRead = objwsh.CurrentDirectory            '读取当前目录
objwsh.CurrentDirectory = "C:\Program Files" '更改当前目录


strRead = objwsh.ExpandEnvironmentStrings("%WinDir%\System32\")
'将指定变量名返回为完整路径,即"扩展变量"


'-------------------------------------------------------------

objwsh.SendKeys strRead                      '向当前活动窗口发送按键

'下面是操作键的发送代码
退格键             {BACKSPACE}、{BS} 或 {BKSP}
BREAK              {BREAK}
CAPS LOCK          {CAPSLOCK}
DEL 或 DELETE      {DELETE} 或 {DEL}
向下键             {DOWN}
END                {END}
ENTER              {ENTER} 或 ~
ESC                {ESC}
HELP               {HELP}
HOME               {HOME}
INS 或 INSERT      {INSERT} 或 {INS}
向左键             {LEFT}
NUM LOCK           {NUMLOCK}
PAGE DOWN          {PGDN}
PAGE UP            {PGUP}
向右键             {RIGHT}
SCROLL LOCK        {SCROLLLOCK}
TAB                {TAB}
向上键             {UP}
F1 至 F12          {F1} 至 {F12}
SHIFT              +
CTRL               ^
ALT                %
+ { 等修饰符       {+} {{} {^} {}} {%}

'如果在按 e 和 c 的同时按 SHIFT 键,则发送字符串参数 +(ec)
'可发送一个键的重复键击。如10次x,为{x 10},但不可发送10次组合键,如Ctrl+x
'不能发送 PRINT SCREEN 键 {PRTSC}
'常用 Wscript.Sleep 来延时若干毫秒发送按键,避免程序来不及响应


'-------------------------------------------------------------

intNumber = objWsh.Popup(strText, nSecondsToWait, strTitle, nType)
'弹出式消息框。比 Msgbox 多了等待选择时间参数,少了帮助参数


'返回值intNumber代表如下按钮:
vbOK     = 1    '确定
vbCancel = 2    '取消
vbAbort  = 3    '放弃
vbRetry  = 4    '重试
vbIgnore = 5    '忽略
vbYes    = 6    '是
vbNo     = 7    '否
           -1   '选择超时


参数:

strText        '要显示的文本信息


nSecondsToWait '等待选择的秒数。若选择超时,消息框自动关闭,返回值 -1
               '缺省值 0 秒,必须选择一个按钮,消息框才会关闭


strTitle       '弹出式消息框的标题。缺省值 "Windows Script Host"

nType          '要显示的按钮和图标类型。缺省值 0
0     显示“确定”按钮
1     显示“确定”和“取消”按钮
2     显示“放弃”、“重试”和“忽略”按钮
3     显示“是”、“否”和“取消”按钮
4     显示“是”和“否”按钮
5     显示“重试”和“取消”按钮
16    显示“停止标记”图标
32    显示“问号”图标
48    显示“感叹号”图标
64    显示“信息标记”图标


'-------------------------------------------------------------

'注册表操作

objWsh.RegWrite "HKLM\SOFTWARE\test", &HFFFF&, "REG_SZ|REG_DWORD|REG_BINARY"
'创建/修改指定键
'&HFF表示16进制数FF。当数值较大时,vbs处理有问题,需在数字后面加&


参数:
REG_SZ  字符型,键值用""括起来。缺省值
REG_DWORD 双字节型
REG_BINARY 二进制型


strRead = objWsh.RegRead("HKLM\SOFTWARE\test")      '读取指定键值

objWsh.RegDelete "HKLM\SOFTWARE\test"               '删除指定键

objWsh.RegWrite "HKLM\SOFTWARE\test\", "", "REG_SZ" '创建一个项,默认值为空

objWsh.RegDelete "HKLM\SOFTWARE\test\"              '删除指定项。可以有键,不能有子项

'-------------------------------------------------------------

objwsh.Run strCommand, intWindowStyle, True|False
'运行指定程序


'参数:strCommand 要运行的命令行及参数

'参数:True|False 是否等命令执行完毕。缺省值False

'参数:intWindowStyle 窗口状态。一般只用到:0隐藏窗口,1显示窗口。缺省值1

'intWindowStyle 有如下可选值:
0  隐藏一个窗口并激活另一个窗口
1  激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置
   第一次显示该窗口时,应用程序应指定此标志
2  激活窗口并将其显示为最小化窗口
3  激活窗口并将其显示为最大化窗口
4  按最近的窗口大小和位置显示窗口。活动窗口保持活动状态
5  激活窗口并按当前的大小和位置显示它
6  最小化指定的窗口,并按照 Z 顺序激活下一个顶部窗口
7  将窗口显示为最小化窗口。活动窗口保持活动状态
8  将窗口显示为当前状态。活动窗口保持活动状态
9  激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置
   还原最小化窗口时,应用程序应指定此标志
10 根据启动应用程序的程序状态来设置显示状态


objwsh.Run "notepad.exe D:\新建 文本文档.txt"        '命令行的参数可以有空格

objwsh.Run """C:\Program Files\WinRAR\WinRAR.exe"""  '命令行带空格,要3对""。可以用Chr(34)代替2对""

strRead = "notepad.exe " + "D:\新建 文本文档.txt"    '连接字符串时注意命令行后加个空格

objwsh.Run "cmd.exe /k echo ""strRead"" strRead "    '运行cmd时,注意参数里的"和变量名

'该方法有返回码

intNumber = objwsh.Run("notepad.exe", , True)
'正常关闭,返回0
'任务管理强制结束,返回1


intNumber = objwsh.Run("cmd.exe /k xcopy", , True)
'输入exit正常关闭,返回值为cmd的错误码%errorlevel%
'任务管理强制结束,返回1
'点cmd窗口右上角的关闭按钮,(winxpsp3)返回-1073741510
'输入 exit /b 111 正常关闭,返回111


'-------------------------------------------------------------

objWsh.LogEvent intType, strMessage, strTarget
'添加"应用程序"日志。日志的"来源"显示为 WSH


'参数:
intType      整数值,代表日志类型(事件 ID)
strMessage   对错误的描述
strTarget    产生错误的计算机名。缺省值为本机名


intType 有如下可选值:
0   无
1   错误
2   警告
4   信息
8   成功审核
16  失败审核


'-------------------------------------------------------------
作者: czjt1234    时间: 2012-10-18 09:46

WshShell 对象的 Environment 属性返回 WshEnvironment 对象

WshEnvironment 对象提供对 Windows 环境变量的访问


属性
Item      缺省属性,指定一个环境变量条目


方法
Count     环境变量的个数
Remove    删除指定的环境变量


'-------------------------------------------------------------

下面是 WshEnvironment 对象的属性和方法的参数,及用法举例

代码测试环境:winxpsp3 IE8 Wscript版本5.7.0.18066

'-------------------------------------------------------------

Dim objWsh, intNumber, strRead, objExec
Dim objWshEnv, objWshSpe, objLink, objUrlLink, objWshExec

set objWsh = CreateObject("Wscript.Shell")

'-------------------------------------------------------------

Set objWshEnv = objWsh.Environment("System|User|Volatile|Process")
'返回 WshEnvironment 对象
'共4种环境变量集合

intNumber = objWshEnv.count       '所含环境变量的个数

objWshEnv.Item("path1") = "test"  '添加/修改一个环境变量

strRead = objWshEnv.Item("path1") '读取指定的环境变量的值

objWshEnv.Remove("path1")         '删除指定的环境变量

For Each strRead in objWshEnv     '枚举所有变量
  Msgbox strRead
Next


'全部的 winxpsp3 环境变量:

System                    User    Volatile       Process
------------------------------------------------------------------------
TEMP                      TEMP                   TEMP
TMP                       TMP                    TMP
NUMBER_OF_PROCESSORS                             NUMBER_OF_PROCESSORS
OS                                               OS   
Path                                             Path   
PATHEXT                                          PATHEXT  
PROCESSOR_ARCHITECTURE                           PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER                             PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL                                  PROCESSOR_LEVEL
PROCESSOR_REVISION                               PROCESSOR_REVISION
FP_NO_HOST_CHECK                                 FP_NO_HOST_CHECK
windir                                           windir
ComSpec                                          ComSpec
                                  LOGONSERVER    LOGONSERVER
                                  CLIENTNAME     CLIENTNAME
                                  SESSIONNAME    SESSIONNAME
                                  APPDATA        APPDATA
                                  HOMEDRIVE      HOMEDRIVE
                                  HOMESHARE
                                  HOMEPATH       HOMEPATH
                                                 CommonProgramFiles
                                                 COMPUTERNAME
                                                 ALLUSERSPROFILE
                                                 ProgramFiles
                                                 USERNAME
                                                 SystemDrive
                                                 SystemRoot
                                                 USERDOMAIN
                                                 USERPROFILE

'-------------------------------------------------------------

作者: czjt1234    时间: 2012-10-18 09:48


WshShell 对象的 SpecialFolders 属性返回 WshSpecialFolders 对象

WshSpecialFolders 对象提供对 Windows 特殊文件夹的访问


属性
Item      缺省属性,指定一个特殊文件夹条目


方法
Count     特殊文件夹的个数


'-------------------------------------------------------------

下面是 WshSpecialFolders 对象的属性和方法的参数,及用法举例

代码测试环境:winxpsp3 IE8 Wscript版本5.7.0.18066

'-------------------------------------------------------------

Dim objWsh, intNumber, strRead, objExec
Dim objWshEnv, objWshSpe, objLink, objUrlLink, objWshExec

set objWsh = CreateObject("Wscript.Shell")

'-------------------------------------------------------------

set objWshSpe = objWsh.SpecialFolders
'返回 WshEnvironment 对象

strRead = objWshSpe.Item("Desktop")      '读取指定条目的完整路径

intNumber = objWshSpe.Count              '特殊文件夹的个数

For intNumber = 0 To objWshSpe.Count - 1
  MsgBox objWshSpe.Item(intNumber)       '枚举所有特殊文件夹
Next


'winxpsp3 操作系统支持下列18个特殊文件夹

AllUsersDesktop
AllUsersStartMenu
AllUsersPrograms
AllUsersStartup
Desktop
AppData
PrintHood
Templates
Fonts
NetHood
Desktop
StartMenu
SendTo
Recent
Startup
Favorites
MyDocuments
Programs

从第1行到第18行,依次可用编号0~17代表
其中 Desktop 重复,不解

'-------------------------------------------------------------

作者: czjt1234    时间: 2012-10-18 09:52

本帖最后由 czjt1234 于 2012-10-30 12:38 编辑

WshShell 对象的 CreateShortcut 方法返回 WshShortcut 对象或 WshUrlShortcut 对象
         
如果快捷方式的后缀名是 .lnk ,则返回的是 WshShortcut 对象
如果快捷方式的后缀名是 .url ,则返回的是 WshUrlShortcut 对象


WshShortcut 对象提供对 .lnk 快捷方式的访问
WshUrlShortcut 对象提供对 .url 快捷方式的访问


'-------------------------------------------------------------

WshShortcut 对象


属性
Arguments            命令行的参数
Description          备注
FullName             快捷方式的完整路径和名称
Hotkey               快捷键
IconLocation         图标。缺省值 0
TargetPath           目标
WindowStyle          运行方式: 1默认窗口(缺省值) 3最大化 7最小化
WorkingDirectory     起始位置



方法
Save                 (覆盖)保存快捷方式



'-------------------------------------------------------------

WshUrlShortcut 对象


属性
FullName             快捷方式的完整路径和名称
TargetPath           目标



方法
Save                 (覆盖)保存快捷方式



'-------------------------------------------------------------

下面是 WshShortcut 和 WshUrlShortcut 对象的属性和方法的参数,及用法举例

代码测试环境:winxpsp3 IE8 Wscript版本5.7.0.18066

'-------------------------------------------------------------

Dim objWsh, intNumber, strRead, objExec
Dim objWshEnv, objWshSpe, objLink, objUrlLink, objWshExec


set objWsh = CreateObject("Wscript.Shell")

'-------------------------------------------------------------

strRead = objWsh.SpecialFolders("Desktop") & "\QQ.lnk" '路径+名称,对应 FullName 属性

set objLink = objWsh.CreateShortcut(strRead)
'返回 WshShortcut 对象


With objLink
  .TargetPath = "D:\QQ2012\Bin\QQ.exe"       '目标

  .Arguments = "1 2 /c:f d"                  '命令行的参数
  .WorkingDirectory = "D:\QQ2012\Bin"        '起始位置
  .Hotkey = ""                               '快捷键
  .WindowStyle = 1|3|7                       '运行方式: 1默认窗口(缺省值) 3最大化 7最小化
  .Description = ""                          '备注
  .IconLocation = "D:\QQ2012\Bin\QQ.exe, 0"  '0表示第一个图标,1代表第二个...

  .Save                                      '(覆盖)保存
End With


'快捷方式图标也可以指定一个图标文件
  .IconLocation = "D:\ICO\QQ.ico"


'快捷键不区分大小写,如 "CTRL+ALT+F"
'快捷键只能激活位于 Windows 桌面或 Windows“开始”菜单的快捷方式

'读取已存在的快捷方式的属性
With objLink
  MsgBox "完整路径和名称:" & .FullName     & vbCrLf & vbCrLf & _
         "目标:"           & .TargetPath   & vbCrLf & vbCrLf & _
         "快捷键:"         & .Hotkey       & vbCrLf & vbCrLf & _
         "运行方式:"       & .WindowStyle  & vbCrLf & vbCrLf & _
         "备注:"           & .Description  & vbCrLf & vbCrLf & _
         "图标:"           & .IconLocation & vbCrLf & vbCrLf & _
         "参数:"           & .Arguments
End With


'-------------------------------------------------------------

strRead = objWsh.SpecialFolders("Desktop") & "\QQ.url" '路径+名称,对应 FullName 属性

set objUrlLink = objWsh.CreateShortcut(strRead)
'返回 WshUrlShortcut 对象


With objUrlLink
  .TargetPath = "
http://www.qq.com"   '目标
  .Save                               '(覆盖)保存
End With


'读取已存在的快捷方式的属性
With With objUrlLink
  MsgBox "完整路径和名称: " & .FullName   & vbCrLf & vbCrLf & _
         "目标:           " & .TargetPath
End With


'-------------------------------------------------------------

作者: czjt1234    时间: 2012-10-18 10:01

本帖最后由 czjt1234 于 2012-10-30 12:46 编辑

WshShell 对象的 Exec 方法返回 WshScriptExec 对象

WshScriptExec 对象提供对运行的程序的输入输出流的访问


属性
ExitCode      进程结束后的返回码
ProcessID     进程ID
Status        进程的运行状态
StdOut        只读输出流
StdIn         只写输入流
StdErr        只读错误信息输出流


方法
Terminate     正常结束进程,但并不等待进程结束就继续执行后续vbs命令


'-------------------------------------------------------------

下面是 WshScriptExec 对象的属性和方法的参数,及用法举例

代码测试环境:winxpsp3 IE8 Wscript版本5.7.0.18066

'-------------------------------------------------------------

Dim objWsh, intNumber, strRead, objExec
Dim objWshEnv, objWshSpe, objLink, objUrlLink, objWshExec

set objWsh = CreateObject("Wscript.Shell")

'-------------------------------------------------------------

Set objExec = objwsh.Exec("calc")
'返回一个 WshScriptExec 对象
'运行calc.exe,就是"计算器"

Msgbox objExec.Status      '进程的运行状态
  Const WshRunning  = 0    '程序仍在运行
  Const WshFinished = 1    '程序已结束
  Const WshFailed   = 2    '??

Msgbox objExec.ProcessID   '进程ID

objExec.Terminate          '正常结束进程,但并不等待进程结束

Msgbox objExec.ExitCode    '进程结束后的返回码,数值和 Run 方法返回的一样

'-------------------------------------------------------------

'WshScriptExec 对象的输入输出流与 Wscript.StdIn StdOut StdErr 不同
'通过如下属性和方法进行访问

Set objExec = objwsh.Exec("cmd.exe")

objExec.StdIn.Write "dir"            '输入 dir 命令,但没有回车换行
objExec.StdIn.WriteBlankLines 5      '输入5个空行,相当于5个 vbCrLf
objExec.StdIn.WriteLine "exit"       '输入命令,并回车换行
objExec.StdIn.Close                  '关闭输入流

Msgbox objExec.StdOut.Read(5)        '从当前光标位置读取5个字符,并相应移动光标
Msgbox objExec.StdOut.ReadLine       '从当前光标位置读取一行,光标移到下一行行首
Msgbox objExec.StdOut.AtEndOfLine    '判断当前光标位置是否在某一行末尾
objExec.StdOut.Skip 3                '跳过3个字符,每行末尾的回车换行算2个字符
objExec.StdOut.SkipLine              '跳过一行,当前光标位置移到下一行行首
Msgbox objExec.StdOut.Line           '返回当前光标所在行号
Msgbox objExec.StdOut.Column         '返回当前光标所在列号
Msgbox objExec.StdOut.AtEndOfStream  '判断当前光标位置是否在文末
Msgbox objExec.StdOut.ReadAll        '从当前光标位置读取文件所有内容,光标移到文末
objExec.StdOut.Close                 '关闭输出流

strRead = objExec.StdOut.ReadAll
'Exec 运行程序,并不等待程序执行完毕。读取所有输出流,则可以起到等程序结束的效果

'StdErr 和 StdOut 的方法属性完全一样

'-------------------------------------------------------------

'一个小Bug

Msgbox objExec.StdOut.ReadLine  'Close 之前用 ReadLine 方法
objExec.StdOut.Close
Msgbox objExec.StdOut.ReadLine  '这行还可以运行
Msgbox objExec.StdOut.ReadLine  '这行才报错,因为对象已经 Close

'-------------------------------------------------------------
附:Run 和 Exec 的方法声明

Function Exec(ByVal Command As String) As WshExec

Function Run(ByVal Command As String, [ByVal WindowStyle], [ByVal WaitOnReturn]) As Integer

'-------------------------------------------------------------





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