# WindowsScript
# Flag
- https://github.com/MicrosoftDocs (opens new window)
- Scripting (opens new window)
- Windows脚本和Windows Script Host的属性和方法及子对象 (opens new window)
- https://github.com/mrpapercut/wscript (opens new window)
- JScript 和 VBScript (opens new window)
- VBScript 脚本技术> HTA (opens new window)
- HTA程序:VBS/JS脚本GUI (opens new window)
JScript
、VBScript
同属于官方支持的Windows Script
,这俩脚本都需要依赖于特定的宿主(Host
)才能执行,JavaScript
浏览器环境之外,还可以运行在Windows Script Host
中。Windows Script Host
是一个language-independent
的脚本宿主环境,主要用于执行Windows
管理任务- Windows脚本宿主有两个版本:
- 一个基于Windows的版本(WScript.exe (opens new window))
,它提供用于设置脚本属性的属性表;运行以
vbs
为后缀的文件 - 一个基于命令提示符的版本(CScript.exe (opens new window)
直接执行可查看帮助),它提供命令行。用于设置脚本属性的开关。
//E:engine
使用执行脚本的引擎有:VBScript
和JScript
- 一个基于Windows的版本(WScript.exe (opens new window))
,它提供用于设置脚本属性的属性表;运行以
# 系统环境变量
环境变量 | 作用 |
---|---|
%ALLUSERSPROFILE% | 指所有用户的用户目录,通常是C:/ProgramData |
%APPDATA% | 指当前用户的Application Data目录,通常是C:/Users/当前用户名/AppData/Roaming |
%CD% | 列出当前目录。 |
%CLIENTNAME% | 列出联接到终端服务会话时客户端的NETBIOS名。 |
%CMDCMDLINE% | 列出启动当前cmd.exe所使用的命令行。 |
%CMDEXTVERSION% | 命令出当前命令处理程序扩展版本号。 |
%CommonProgramFiles% | 指公用文件(Common Files)目录, 通常是C:/Program Files/Common Files |
%COMMONPROGRAMFILES(x86)% | C:\Program Files (x86)\Common Files |
%COMPUTERNAME% | 列出了计算机名。 |
%COMSPEC% | 列出了可执行命令外壳(命令处理程序)的路径。 |
%DATE% | 列出当前日期。 |
%ERRORLEVEL% | 列出了最近使用的命令的错误代码。 |
%HOMEDRIVE% | 同%SYSTEMDRIVE% |
%HOMEDRIVE%%HOMEPATH% | 同%USERPROFILE% |
%HOMEPATH% | 同%USERPROFILE% |
%HOMESHARE% | 列出用户共享主目录的网络路径。 |
%LOCALAPPDATA% | C:\Users\用户名\AppData\Local |
%LOGONSERVER% | 返回验证当前登录会话的域控制器的名称。 |
%NUMBER_OF_PROCESSORS% | 计算机上运行的处理器数目。 |
%OS% | 用户工作站所用的操作系统。 |
%PATH% | 路径环境变量。 |
%PATHEXT% | 列出操作系统认为可被执行的文件扩展名,通常为 .com、 .exe、.bat 或 .cmd |
%PROCESSOR_ARCHITECTURE% | 用户工作站使用的处理器类型。 |
%PROCESSOR_IDENTFIER% | 列出了处理器的描述。 |
%PROCESSOR_LEVEL% | 列出了计算机的处理器的型号。 |
%PROCESSOR_REVISION% | 列出了处理器的修订号。 |
%PROGRAMDATA% | C:\ProgramData |
%ProgramFiles% | 指Program Files的路径,通常是C:/Program Files |
%PROGRAMFILES(X86)% | C:\Program Files (x86) |
%PROMPT% | 列出了当前命令解释器的命令提示设置。 |
%PUBLIC% | C:\Users\Public |
%RANDOM% | 列出界于0 和 32767之间的随机十进制数。 |
%SESSIONNAME% | 列出连接到终端服务会话时的连接和会话名。 |
%SYSTEM% | C':\WINDOWS\SYSTEM32 |
%SYSTEMDRIVE% | 系统所在的本地驱动器(例如,c:)。 |
%SYSTEMROOT% | 指Windows系统所在的目录,通常是C:/Windows |
%TEMP% | 指当前用户的临时文件目录,通常是C:/Users/当前用户名/AppData/Local/Temp |
%TIME% | 列出当前时间。 |
%TMP% | 同%TEMP% |
%USERDOMAIN% | 列出了包含用户帐号的域的名字。 |
%USERNAME% | 列出当前登录的用户的名字。 |
%USERPROFILE% | 指当前帐户的用户目录通常是C:/Users/当前用户名 |
%WINDIR% | 同%SYSTEMROOT% |
# WScript对象
所有的
Wscript
对象都存放在WSHOM.ocx
文件中
# WScript对象的属性
属性 | 返回值类型 | 说明 |
---|---|---|
Application | Object | 返回 IHost_Class 对象(Wscript 对象)。 |
Arguments | IArguments_Class | 返回 WshArguments 对象(参数集)。 |
BuildVersion | Long | 返回 Windows 脚本宿主的内部版本。 |
FullName | String | 返回宿主可执行文件(CScript.exe 或 WScript.exe)的全路径。 |
Interactive | Boolean | 设置或确定脚本模式。 |
Name | String | WScript 对象(宿主可执行文件)的名称。 |
Path | String | 返回包含宿主可执行文件(CScript.exe 或 WScript.exe)的路径名称。 |
ScriptFullName | String | 返回当前运行脚本的完整路径。 |
ScriptName | String | 返回当前运行脚本的文件名。 |
StdIn | TextStream | 显示当前脚本的输入流。 |
StdErr | TextStream | 显示当前脚本的错误输出流。Write 输出,WriteLine 换行输出 |
StdOut | TextStream | 显示当前脚本的输出流。Write 输出,WriteLine 换行输出 |
Timeout | Long | 超时设定秒:允许脚本运行的最长时间。 |
Version | String | 返回 Windows 脚本宿主的版本。 |
# WScript对象的方法
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
ConnectObject | (Object As Object, Prefix As String) | 无 | 将对象的事件源连接到具有给定前缀的函数。 |
CreateObject | (ProgID As String, [Prefix As String]) | Object | 创建对象。 |
DisconnectObject | (Object As Object) | 无 | 断开已连接对象的事件源的连接。 |
Echo | (ParamArray pArgs() As Variant) | 无 | 将文本输出到消息框中或命令控制台窗口。 |
GetObject | (Pathname As String, [ProgID As String], [Prefix As String]) | Object | 检索现有的对象或从文件中创建新对象。 |
Quit | ([ExitCode As Long]) | 无 | 强制脚本停止执行。 |
Sleep | (Time As Long) | 无 | 在指定的时间长度内将脚本执行挂起,然后继续执行。 |
# 常用组件对象
所有对象都可通过
Power Shell
命令查看属性和方法New-Object -ComObject "对象名称" | Get-Member
, 获取本机所有COM
组件对象脚本 Get-COM-Objects.bat
都在注册表
HKEY_CLASSES_ROOT
注册表项中,正常情况下项中带有CLSID
键的是脚本可创建的
对象 | 说明 |
---|---|
WScript.Shell | 脚本外壳 |
Wscript.NetWork | 提供网络连接和远程打印机管理的函数。 |
AspSmartUpload.SmartUpload | |
CDO.Configuration | |
CDONTS.NewMail | 邮件发送的组件 |
Huang.UploadFile | |
InternetExplorer.application | |
JMail.message | 邮件发送的组件 |
MSWC.AdRotator | |
MSWC.BrowserType | |
MSWC.NextLink | |
Shell.Application | Windows外壳 |
SQLOLE.SQLServer | |
WSHController | |
System.IO.StringWriter | |
Registry | 注册表 |
ADODB对象 | 说明 |
---|---|
ADODB.Command | |
ADODB.Connection | 提供数据库连接对象 |
ADODB.Error | |
ADODB.Parameter | |
ADODB.Record | |
ADODB.Recordset | 提供数据库返回结果集对象 |
ADODB.Stream | |
ADOMD.Catalog | |
ADOMD.Cellset | |
ADOX.Catalog | 包含描述数据源模式目录的集合 |
ADOX.Column | 表示表、索引或关键字的列 |
ADOX.Group | 表示在安全数据库内有访问权限的组帐号 |
ADOX.Index | 表示数据库表中的索引 |
ADOX.Key | 表示数据库表中的主关键字、外部关键字或唯一关键字 |
ADOX.Procedure | 表示存储的过程 |
ADOX.Table | 表示数据库表,包括列、索引和关键字 |
ADOX.User | 表示在安全数据库内具有访问权限的用户帐号 |
ADOX.View | 表示记录或虚拟表的过滤集 |
office对象 | 说明 |
---|---|
Word.Application | office |
Word.Document | |
Excel.Application | 提供EXCEL操作对象 |
Excel.Chart | |
Excel.Sheet | |
Outlook.Application | office |
PowerPoint.Application | office |
MSGraph.Application | office |
WIA对象 | 说明 |
---|---|
WIA.ImageFile | 图像处理组件:加载图片 |
WIA.ImageProcess | 图像处理组件:转换图片格式 |
WIA.Rational | |
WIA.Vector |
所有
Scripting
对象都存放在SCRRUN.DLL
文件中
Scripting对象 | 说明 |
---|---|
Scripting.Dictionary | 用来返回存放键值对的字典对象,读取DOS环境变量,读取链接中的设置 |
Scripting.Encoder | 编码 |
Scripting.FileSystemObject | 提供一整套文件系统操作函数 |
Scripting.Signer | 签名 |
Collections对象 | 说明 |
---|---|
System.Collections.ArrayList | 包含动态数组的添加元素、删除元素、遍历、统计元素个数、清空 |
System.Collections.Hashtable | |
System.Collections.Queue | 包含队列的添加元素(入队)、删除元素(出队)、遍历、统计元素个数、清空 |
System.Collections.SortedList | |
System.Collections.Stack | 包含堆栈的添加元素(压栈)、删除元素(出栈)、遍历、统计元素个数、清空 |
# HTTP
微软提供了二套API:
WinINet
,WinHTTP
(分别封装于system32
目录下的wininet.dll
和winhttp.dll
内) 二者主要区别在于后者更为安全和稳定,可以说WinHTTP
是WinINet
的升级版
XMLHttpRequest
是基于WinInet
封装的,而WinHttpRequest
和ServerXMLHTTPRequest
则是基于WinHTTP
封装的 稳定性属XMLHttpRequest
为最差,封装成COM
形式主要是为了方便js
、vbs
等脚本的调用
XMLRequest
成员参考缺点:和浏览器挂钩,大多情况下会共享cookies
、session
、不支持单独设置代理。 优点:和浏览器挂钩,大多情况下会共享cookies
、session
ServerXMLHTTP
成员参考缺点:系统没有对应dll
的情况下程序需要外挂一个dll
文件。优点:脱离浏览器,使用代理方便
WinHttpRequest
成员参考缺点:暂无。优点:脱离浏览器,使用代理方便,WinHttp.WinHttpRequest.5.1
是msxml4.0
的底层对象,也就是说XMLHTTP
、ServerXMLHTTP
也是在它的基础上封装而来
# 图像处理
WIA
全称:WindowsImageAcquisition
,自动化层是一个功能齐全的图像处理组件,可提供端到端的图像处理功能。WIA
自动化层可以轻松地从数码相机,扫描仪或网络摄像头获取图像,以及旋转,缩放和注释图像文件。WIA Automation Layer
取代了Windows Image Acquisition(WIA)1.0
提供的WIA
脚本模型。
New-Object -ComObject "WIA.ImageFile" | Get-Member
New-Object -ComObject "WIA.ImageProcess" | Get-Member
- Windows图像采集(WIA) (opens new window)
- 使用 (opens new window)
- 常量 (opens new window)
- Windows Image Acquisition (opens new window)
- WIA图片处理 (opens new window)
# 操作文件
Scripting.FileSystemObject
对象提供的功能:New-Object -ComObject "Scripting.FileSystemObject" | Get-Member
- FileSystemObject简介 (opens new window)
- FileSystemObject 对象 (opens new window)
- FileSystemObject操作文件 (opens new window)
对象和集合
对象/集合 | 描述 |
---|---|
Drive | 包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器 |
Drives | 提供一个物理和逻辑驱动器的列表 |
File | 检查和处理文件 |
Files | 提供包含在文件夹内的所有文件的列表 |
Folder | 检查和处理文件夹 |
Folders | 提供在 Folder 内的所有文件夹的列表 |
TextStream | 对象。用来读写文本文件。 |
注意:
TextStream
对文件只可以从上往下读取,指针无法任意定位,也无法往回走。
fso.OpenTextFile(path,[mode,create,encoding])
mode
模式,缺省为只读方式打开ForReading=1
以只读方式打开ForWriting=2
以读写方式打开ForAppending=8
以附加方式打开
create
不存在时是否创建缺省为否,即不创建文件encoding
何种方式打开,缺省以ASCII
方式TristateUseDefault=-2
以系统默认方式打开TristateTrue=-1
以Unicode
方式打开TristateFalse=0
以ASCII
方式打开
fso.CreateTextFile(path,[overrwite,unicode])
overrwite
是否覆盖,缺省为是unicode
是否以Unicode
方式创建,缺省为false
,即以ASCII
方式创建
# Shell
- Shell.Application https://docs.microsoft.com/zh-cn/windows/win32/shell (opens new window)
- Wscript.Shell 对象详细介绍 (opens new window)
- WshShell 对象 (opens new window)
- WScript.Shell 与 Shell.Application 的不同 (opens new window)
Wscript.Shell
对象提供的功能:New-Object -ComObject "Wscript.Shell" | Get-Member
Shell.Application
对象提供的功能:New-Object -ComObject "Shell.Application" | Get-Member
Run
Exec
执行cmd
命令,同Shell.Application
的ShellExecute
(opens new window)CreateShortcut
创建快捷方式SpecialFolders
访问Windows
的shell
文件夹Environment
操作环境变量RegRead
从注册表中返回指定的键或值RegWrite
在注册表中设置指定的键或值RegDelete
从注册表中删除指定的键或值SendKeys
模拟按键Popup
显示包含指定消息的消息弹出窗口ExpandEnvironmentStrings
返回环境变量的扩展值ExpandEnvironmentStrings("%USERNAME%")
获取用户名ExpandEnvironmentStrings("%ComputerName%")
获取计算机名
# 执行命令
Run
执行命令完成后返回值是一个整数,就是
0
成功或1
失败两个状态。
int Run(string, Variant, Variant)
第二个是cmd
窗口的风格,第三个是否等待执行完成。
窗口风格 | 说明 |
---|---|
0 | 隐藏一个窗口并激活另一个窗口。 |
1 | 如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。 |
2 | 激活窗口并将其显示为最小化窗口。 |
3 | 激活窗口并将其显示为最大化窗口。 |
4 | 按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。 |
5 | 激活窗口并按当前的大小和位置显示它。 |
6 | 最小化指定的窗口,并按照Z顺序激活下一个顶部窗口。 |
7 | 将窗口显示为最小化窗口。活动窗口保持活动状态。 |
8 | 将窗口显示为当前状态。活动窗口保持活动状态。 |
9 | 如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。 |
10 | 根据启动应用程序的程序状态来设置显示状态 |
Exec
返回值是一个对象,从返回对象中可以获得控制台输出信息和控制台错误信息,即
StdOut
和StdErr
属性等。
Exec
类具有属性ExitCode
、ProcessID
、Status
、StdErr
、StdIn
、StdOut
以及一个函数Terminate
Status
属性具有三个值:0为正在执行,1为完成,2为失败- 获取输出信息:
StdOut.ReadAll()
Shell.Application运行文件的5种方法
Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace("c:/")
' 方法1
objFolder.Items().item("demo.exe").invokeverb
' 方法2
objFolder.Items().item("demo.exe").InvokeVerbEx
' 方法3
objShellApp.Open("C:/demo.exe")
' 方法4,可以加参数和设置参数值
objShellApp.ShellExecute "demo.exe","","c:/","", 0
' 方法5:在文件上打开鼠标邮件点击打开按钮
Set objFolderItem = objShellApp.NameSpace("C:/").Items().item("demo.exe")
Set objFIVs = objFolderItem.Verbs()
For i=0 To objFIVs.Count - 1
' MsgBox objFIVs.Item(i)
Set objFIV = objFIVs.Item(i)
If objFIV.Name = "打开(&O)" Then '右键菜单中在中文系统是"打开(&O)",英文自己改
objFIV.DoIt
Exit For
End IF
Next
# 特殊文件夹
SpecialFolders
属性提供WshSpecialFolders
对象以便访问Windows
的shell
文件夹
使用:
WshShell.SpecialFolders("strFolderName")
,如果没有查询的目录则返回NULL
变量名 | 说明 |
---|---|
AllUsersDesktop | 公共桌面 |
AllUsersStartMenu | 公共程式 |
AllUsersPrograms | 公共程序 |
AllUsersStartup | 公共启动 |
Desktop | 桌面 |
Favorites | 收藏 |
Fonts | 字体 |
MyDocuments | 我的文档 |
NetHood | 网络 |
PrintHood | 打印机 |
Programs | 程序 |
Recent | 最近 |
SendTo | 发给 |
StartMenu | 开始菜单 |
Startup | 启动 |
Templates | 模板 |
AppData | 应用程序数据 |
# 模拟按键
SendKeys
键击参数说明Enter
回车建表示{Enter}
、字母A
表示{A}
、数字2
表示{2}
等- 示例
Wshshell.SendKeys("{Enter}")
、Wshshell.SendKeys("{A}")
、Wshshell.SendKeys("{2}")
- 示例
- 组合键
Shift
用+
代替、Ctrl
用^
代替、Alt
用%
代替- 示例
Wshshell.SendKeys("+%{DELETE}")
、Wshshell.SendKeys("^{C}")
、Wshshell.SendKeys("^{V}")
- 示例
- 模拟快捷键
Ctrl + S
保存内容:Wshshell.SendKeys("^{s}")
- 使用
+{f10}
可以z有限制地方调用,如调用桌面菜单{f5}+{f10}
# WMI和MI
Windows Management Instrumentation(WMI)的新版本是 Windows Management Infrastructure (MI)
SWBEM
脚本是可以用来访问和控制WMI内部对象的一系列可用在脚本中的对象, 脚本通过访问wbemdisp.dll
这个library
来访问VMI
对象,这个仅被设计用来为脚本工作。
查询方式类似sql语句(其实系统信息也是存储在计算中一个类似数据库的文件中)获取我们需要的对象的记录集
- WbemScripting脚本API对象 (opens new window)
- 系统注册表提供者 (opens new window)
- Win32 Provider-可以看到表对应的字段有哪些 (opens new window)
表名 | 说明 |
---|---|
Win32_BaseBoard | 主板 |
Win32_BIOS | BIOS芯片 |
Win32_BootConfiguration | 系统启动配置 |
Win32_CDROMDrive | 光盘驱动器 |
Win32_ComputerSystem | 操作系统信息,系统位数 |
Win32_DesktopMonitor | 显示器 |
Win32_DiskDrive | 硬盘驱动器 |
Win32_DiskPartition | 磁盘分区 |
Win32_Group | 系统管理组 |
Win32_GroupUser | 系统组帐号 |
Win32_Keyboard | 键盘 |
Win32_LogicalDisk | 逻辑磁盘 |
Win32_LogicalMemoryConfiguration | 逻辑内存配置 |
Win32_NetworkAdapter | 网络适配器 |
Win32_NetworkAdapterConfiguration | 网络适配器设置 |
Win32_NetworkClient | 已安装的网络客户端 |
Win32_NetworkProtocol | 已安装的网络协议 |
Win32_OperatingSystem | 操作系统信息,系统版本 |
Win32_PageFile | 系统页文件信息 |
Win32_PageFileSetting | 页文件设置 |
Win32_ParallelPort | 并口 |
Win32_PhysicalMemory | 物理内存 |
Win32_PointingDevice | 点输入设备,如鼠标 |
Win32_POTSModem | MODEM |
Win32_POTSModemToSerialPort | MODEM端口 |
Win32_Printer | 打印机 |
Win32_PrinterConfiguration | 打印机设置 |
Win32_PrintJob | 打印机任务 |
Win32_Process | 系统进程 |
Win32_Processor | CPU处理器 |
Win32_SerialPort | 串口 |
Win32_Service | 系统安装的服务 |
Win32_Share | 共享 |
Win32_SoundDevice | 多媒体设置 |
Win32_StartupCommand | 系统自动启动程序 |
Win32_SystemDriver | 驱动程序 |
Win32_TCPIPPrinterPort | 打印机端口 |
Win32_Thread | 系统线程 |
Win32_TimeZone | 时区 |
Win32_USBController | USB控制器 |
Win32_UserAccount | 用户帐号 |
Win32_VideoController | 显卡细节。 |
Win32_VideoSettings | 显卡支持的显示模式。 |
Win32_ScheduledJob | 创建一个作业AT命令(不是任务计划) |
Win32_NetworkLoginProfile | 一个特定的用户运行Windows的计算机系统上的网络登录信息。 |
MSFT_NetAdapter | 逻辑网络适配器 |
Win32_NetworkConnection | 一个基于Windows的环境中活动的网络连接 |
创建SWbemServices对象方式
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")
' 隐式使用本地计算机(.) 和默认名称空间("root\cimv2")
Set objWMIService = GetObject("winmgmts:")
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
Set objWMIService = GetObject("winmgmts:root\cimv2")
Set objWMIService = GetObject("winmgmts://./root/cimv2")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
' wmi与cimv2不同
Set objWMIService = GetObject("winmgmts:\\.\root\wmi")
// JScript.
var LoginProfiles = GetObject("winmgmts:").InstancesOf ("Win32_NetworkLoginProfile");
for(e = new Enumerator(LoginProfiles) ; !e.atEnd() ; e.moveNext()) {
var Profile = e.item();
WScript.Echo(Profile.Name);
WScript.Echo(Profile.LastLogon);
}