中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原]setx.vbs重启依然有效的系统环境变量
« [1] [2] »
作者:
标题: [原]setx.vbs重启依然有效的系统环境变量 上一主题 | 下一主题
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『楼 主』:  [原]setx.vbs重启依然有效的系统环境变量

感谢 slore兄在15楼的建议,现代码修改如下:
'By electroniXtar @ CN-DOS.NET, Special thanks to namejm, slore.
set oSysVar=CreateObject("WScript.Shell").Environment("system") '系统环境变量的数组对象
set oArgu = WScript.Arguments 'vbs调用参数
If oArgu(1)="" then '如果第二个参数为0长度字符则删除变量
oSysVar.Remove(oArgu(0))
else
oSysVar(oArgu(0))=oArgu(1) '添加变量
end if
可以支持删除变量了:
添加/修改系统变量: setx.vbs 变量名 变量值
删除变量:setx.vbs 变量名 ""

由于懒,所以没有写 没有参数时显示帮助 功能了

============以下是原贴内容================
'By electroniXtar @ CN-DOS.NET
set oShell=CreateObject("WScript.Shell")
oShell.Environment("system")(WScript.Arguments(0))=WScript.Arguments(1)
用法:
setx.vbs 系统变量名称 系统变量值

例如:
附图里的 setx.vbs 1 2

可以基本取代 Win2003里的 setx.exe ,大家在批处理中echo出这个vbs出来就可以调用了。

相当于手工在这里设置:

[ Last edited by electronixtar on 2007-2-28 at 01:58 PM ]

   此帖被 +33 点积分      点击查看详情   
评分人:【 ccwan 分数: +9  时间:2007-2-27 20:54
评分人:【 namejm 分数: +8  时间:2007-2-27 21:30
评分人:【 redtek 分数: +12  时间:2007-2-27 21:44
评分人:【 everest79 分数: +4  时间:2007-2-28 10:59


附件 1: 1.JPG (2007-2-27 16:14, 37.74 K, 下载附件所需积分 1 点 ,下载次数: 1)





C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2007-2-27 16:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 2 楼』:  

好东西啊!谢谢分享!我坐沙发。^_^



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-2-27 20:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HUNRYBECKY
银牌会员





积分 1179
发帖 442
注册 2006-9-9
状态 离线
『第 3 楼』:  

好东西,支持.
随便给点关于wscript.shell脚本对象的资料:
Wscript.Shell 对象详细介绍2007-02-13 11:43WshShell 对象
ProgID Wscript.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 = Wscript.CreateObject("Wscript.Shell")

Set WshSysEnv = WshShell.Environment("SYSTEM")
Wscript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")

请参阅
WshEnvironment 对象


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

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


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

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


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

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


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

语法
WshShell.SpecialFolders = objWshSpecialFolders

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

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

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


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

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

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 = Wscript.CreateObject("Wscript.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 script
Set WshShell = Wscript.CreateObject("Wscript.Shell")
Set oShellLink = WshShell.CreateShortcut("Current Script.lnk")
oShellLink.TargetPath = Wscript.ScriptFullName
oShellLink.Save
Set oUrlLink = 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 快捷方式对象的参数。
Description 快捷方式对象的说明。
Hotkey 快捷方式对象的热键。
IconLocation 快捷方式对象的图标位置。
TargetPath 快捷方式对象的目标路径。
WindowStyle 快捷方式对象的窗口样式。
WorkingDirectory 快捷方式对象的工作目录。


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

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

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

语法
WshShortcut.Arguments = strArguments

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

语法
WshShortcut.Description = strDescription

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 = Wscript.CreateObject("Wscript.WshShell")
strDesktop = WshShell.SpecialFolders("Desktop")
Set oMyShortcut = WshShell.CreateShortcut(strDesktop & "\a_key.lnk")
OMyShortcut.TargetPath = "%windir%\notepad.exe"
oMyShortCut.Hotkey = "ALT+CTRL+F"
oMyShortCut.Save
Wscript.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 Scripting 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 = Wscript.CreateObject("Wscript.Shell")
WshShell.Popup "Where do you want to go today?"

请参阅
Wscript.Echo 方法

Wscript.Echo
Echo 方法在窗口(Wscript.exe 中)或“命令提示符”窗口(Cscript.exe 中)显示参数。

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

语法
Wscript.Echo [anyArg...]

示例
Wscript.Echo
Wscript.Echo 1, 2, 3
Wscript.Echo "Windows Scripting 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 = Wscript.CreateObject("Wscript.Shell")

WshShell.RegDelete "HKCU\ScriptEngine\Value" '' Delete value "Value"
WshShell.RegDelete "HKCU\ScriptEngine\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 = Wscript.CreateObject("Wscript.Shell")

WshShell.RegRead("HKCU\ScriptEngine\Val") '' Read from value "Val"
WshShell.RegRead("HKCU\ScriptEngine\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 = Wscript.CreateObject("Wscript.Shell")

WshShell.RegWrite "HKCU\ScriptEngine\Value", "Some string value"
WshShell.RegWrite "HKCU\ScriptEngine\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 script
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("notepad " & Wscript.ScriptFullName)
WshShell.Run ("%windir%\notepad" & Wscript.ScriptFullName)

'' This fragment returns the error code from the executed application
Return = WshShell.Run("notepad " & Wscript.ScriptFullName, 1, TRUE)   
下面给出一些脚本实例,都是从网站上找的.
从Windows 98时代起,各种脚本文件不断出现,脚本文件的作用是为了实现各种脚本文件在 Windows 界面或 Dos 命令提示符下的直接运行,微软就在系统内植入了一个基于 32 位 Windows 平台、独立的脚本运行环境,并将其命名为“Windows Scripting Host(Windows 脚本宿主以下简称WSH)”。
WSH 诞生后,在 Windows 系列产品中很快得到了推广。除 Windows 98 外,微软在 Internet Information Server、Windows ME、Windows 2000系列产品以及 Windows XP Professional等产品中都嵌入了 WSH。一般来说,各种软件总要考虑多数人的习惯和需求,而对于一些个性化很强的需求,通用软件则很难满足。现在利用WSH,我们可以完成很多有趣又实用的功能,而且实现代码非常简单,而且完全是为自己量身定做,100%满足自己的需求。这么简单、实用有有趣的东西,怎么可以放过呢?
一、WSH是怎么样工作的
WSH正常工作的前提条件是系统中必须有IE3.0以上的版本,因为 WSH 在工作时需要使用IE 中的 VBScript 和 JScript 解释引擎。
首先,我们来看一个最简单的例子,打开记事本,在其中写下:
WScript.Echo("你好!电脑")
然后将它为以 .vbs 或 .js 为后缀名(千万不能保存为TXT文件,保存的时候在“文件类型”中选择“所有文件”)的文件进行保存,然后关掉这个记事本。从文件的图标来看已经变成一个脚本文件,双击执行这个文件,看看结果吧(如图1),我们编辑的第一个脚本已经成功运行啦!
图1
现在,就让我们来看看脚本文件经由WSH执行的过程。首先WSH根据脚本文件后缀名,在系统注册表中查询所需的脚本引擎时,如VBScript或者JScript。然后使用相应的脚本引擎执行脚本命令,其中,一些脚本指令会使用到WSH的内置对象(如处理注册表项),这时,脚本指令就会向WSH提出请求,并由WSH完成这些指令。
那么,如何去编写并运行WSH脚本呢?WSH脚本文件的编写十分方便,你可以选用任意一个文字编辑器进行编写,写完后,你只需将它保存为 WSH 所支持的文件名就行了(如 .js 文件、.vbs 文件)。最常用的编辑器就是我们编写第一个脚本文件用到的记事本(Notepad)了。


一、WSH初步
下面,我们来看看一些WSH的初步实例,其中每个实例可以实现一个简单的功能,在我们了解每个实例的功能后,我们会把这些例子综合成一个非常实用的脚本,帮助你实现实用、个性化的强大功能。
1.在桌面创建快捷方式
WSHShell = WScript.CreateObject("WScript.Shell");
DesktopPath = WSHShell.SpecialFolders("Desktop");
Shortcut1 = WSHShell.CreateShortcut(DesktopPath + "\\记事本快捷方式.lnk");
Shortcut1.TargetPath = "c:\\Windows\\notepad.exe";
Shortcut1.Save();
其中SpecialFolders这个函数是用来读取桌面路径的,取得桌面路径后,在桌面上创建一个“\记事本快捷方式.lnk”的文件,并将这个快捷方式文件的目标指向Notepad.exe,最后将这些信息保存,这个脚本的工作就完成了。

2.执行特定的命令
下列这个示例会用记事本打开“ C:\autoexec.bat”文件,并开启 DOS 命令窗口(并列出执行 dir c:\Windows 的结果),程序代码如下:

// 产生 WSH Shell
shell = WScript.CreateObject("WScript.Shell");

// 开启记事本并加载 c:\autoexec.bat
shell.Run("notepad.exe c:\\autoexec.bat");

// 开启 DOS 命令窗口并执行 dir c:\Windows
shell.Run("cmd /K dir c:\\Windows");


在上述范例中,所开启的应用程序会保持开启状态,而 WSH 会持续执行其后的程序代码。若要等待应用程序被关闭后,才继续执行其后的 WSH 程序代码,可以在 run() 之后再加上其它参数。如我们需要在关闭Notepad后再继续执行,应该怎么办呢?

// 如何由 WSH 执行其它应用程序,并等待应用程序结束后才继续执行 WSH 程序代码
shell = new ActiveXObject("WScript.Shell");
intReturn = shell.Run("notepad " + WScript.ScriptFullName, 1, true);
shell.Popup("记事本已经被关闭!");

3.列出一个特定目录下的所有文件
//创建文件系统对象
fso = new ActiveXObject("Scripting.FileSystemObject");
//指向指定的文件夹
dir="c:\\Windows\\temp";
fsofolder = fso.GetFolder(dir);
//搜集文件夹中包含的文件
colFiles = fsofolder.Files;
fc = new Enumerator( colFiles );
//显示并继续读取其它文件的文件名直到完成
WScript.Echo("Files under \""+dir+"\":");
for (; !fc.atEnd(); fc.moveNext() ){
WScript.Echo(fc.item());
}
脚本执行后会将指定目录中(C:\windows\temp)的所有文件一一列出来。

4.显示本机IP地址
ws = new ActiveXObject( "MSWinsock.Winsock" );
WScript.Echo("本机IP地址是:" + ws.LocalIP);
通过MSWinsock.Winsock这个函数将IP地址收集起来并进行显示。

5.列出磁盘驱动器及其相关性质

fso = new ActiveXObject("Scripting.FileSystemObject");
driveTypeNames=["未知类型", "可移动磁盘", "硬盘", "网络磁盘驱动器", "光盘", "虚拟磁盘"];
e = new Enumerator(fso.Drives);
s = "";
for (; !e.atEnd(); e.moveNext()) {
x = e.item();
WScript.Echo(x.DriveLetter+":")
WScript.Echo(" 磁盘类型:" + x.DriveType + " (" + driveTypeNames[x.DriveType] + ")");
WScript.Echo(" 共享名称:" + x.ShareName);
WScript.Echo(" 磁盘是否就绪:" + x.IsReady);
if (x.IsReady){
WScript.Echo(" 卷标:" + x.VolumeName);
WScript.Echo(" 空间大小:" + x.AvailableSpace + "字节");
}
}
执行了这个脚本以后会显示出该磁盘驱动器的类型、卷标、空间大小、共享名称等相关信息。

6.显示当前时间
today = new Date();
WScript.Echo("电脑迷为您报时:"+today.toLocaleString());
除了这样的方法之外,还有一种比较复杂一点的方法,可以显示上、下午时间
function getTime() {
today = new Date();
hour = today.getHours();
minute = today.getMinutes();
second = today.getSeconds();
prepand = (hour>=12)? "下午":"上午";
hour = (hour>=12)? hour-12:hour;
str = "现在时间是"+prepand+hour+"点"+minute+"分"+second+"秒";
return(str);
}
WScript.Echo(getTime());

7.保存当前的网页
// 抓取一个网页,并将其内容存入一个文件
inet=new ActiveXObject("InetCtls.Inet");
// 下载的网址
inet.Url="http://www.pcfans.net/index.htm";
// 设置超时
inet.RequestTimeOut=20;
// 下载文件
WScript.Echo("Downloading \""+inet.Url+"\"...");
content = inet.OpenURL();

// 写入文件
fso = new ActiveXObject("Scripting.FileSystemObject");
forReading=1, forWriting=2;
fileName="test.htm";
fid=fso.OpenTextFile(fileName, forWriting, true);
fid.Write(content);
fid.Close();
WScript.Echo("从「"+inet.Url+"」抓到的內容已被存入「"+fileName+"」!");

8.列出与 SYSTEM 相关的重要环境变量
shell = WScript.CreateObject("WScript.Shell");
envObj = shell.Environment("SYSTEM");

WScript.Echo("====== 所有的 SYSTEM 环境变量列表:");
WScript.Echo("No. of env. variables = "+envObj.length);
var Enum=new Enumerator(envObj)
for (Enum.moveFirst(); !Enum.atEnd(); Enum.moveNext())
// WScript.Echo(Enum.item()+" ===> "+envObj(Enum.item()));
WScript.Echo(Enum.item());
有没有看过“系统” 属性?对于属性中的系统环境的相关配置还需要用手动来查看吗?这个脚本就可以解决掉这一系列的问题。


9.从Outlook Express中自动读取信件的脚本
var profile = "Microsoft Outlook Internet Settings";
omapi = new ActiveXObject( "MAPI.Session" );
omapi.Logon( profile );
objFolder = omapi.Inbox;
objMsg = objFolder.Messages;
myMsg = objMsg.GetFirst();
msg = myMsg.Text;
WScript.Echo( msg );
for ( i = 0; i < 10; i++ )
{
myMsg = objMsg.GetNext();
msg = myMsg.Text;
WScript.Echo( msg );
}
这样个脚本可以自动从Outlook Express的收件邮中找出最近收到的10封电子邮件,这样就不需要打开Outlook就可以快速的阅读信件了。


10.查看文件的详细属性
var file = "results.html";
// 创建文件系统并获取文件
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
var f = fso.GetFile( file );
// Access properties and format results.
var fileinfo = "Results for " + file + "\n";
fileinfo += "名称:" + f.Name + "\n";
fileinfo += "属性:" + f.Attributes + "\n";
fileinfo += "大小:" + f.Size + " Bytes\n";
fileinfo += "创建日期:" + f.DateCreated + "\n";
fileinfo += "最后访问日期:" + f.DateLastAccessed + "\n";
fileinfo += "最后修改时期:" + f.DateLastModified + "\n";
fileinfo += "驱动器:" + f.Drive + "\n";
fileinfo += "类型:" + f.Type + "\n";
// 显示结果
WScript.Echo( fileinfo );

利用这个函数Scripting.FileSystemObject,我们可以实现对于某一个文件的详细属性进行查看,如果所要查看的文件和该脚本不处于同一目录中,就需要输入完整的文件路径名来进行查看。别外,这个脚本需要使用命令行的方式来使用。
在DOS中运行的方法如下:在 DOS 运令行方式窗口中输入「cscript //<脚本文件名>」或「wscript //<脚本文件名>」这样就可以得到运行后的效果了。


11.自定义设定压缩文件
WinRAR是比较流行的一个压缩程序。在安装完成WinRAR后,首先需要为WinRAR的运行添加一个相对路径,这有点类似于DOS中的config.sys文件中对可执行文件加入的路径。在系统的环境变量里加入“set path=c:\Windows;c:\program files\WinRAR”后就可以直接调用WinRAR了。对于WinRAR的命令行具体的用法,可以在DOS窗口或命令行窗口中输入“RAR.exe /?”就可以得到帮助。
将WinRAR准备完成后就可以用下面的脚来来完现自定义压缩了。

Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("c:\\rar.exe c:\\test.rar c:\\a.txt c:\\b.txt")
<script language="VBScript.Encode" runat=server>
Set WshShell = server.CreateObject("Wscript.Shell")
IsSuccess = WshShell.Run (" c:\\rar.exe c:\\test.rar c:\\a.txt c:\\b.txt" ,1, true)
if IsSuccess = 0 Then
Response.write " 命令成功执行!"
else
Response.write " 命令执行失败!权限不够或者该程序无法在DOS状态下运行"
end if
</script>
二、综合应用
我们看来这么多单独的例子,现在我们把上面的脚本略加修改,组合在一起,使它成为一个非常方便的工具,它可以实现如下功能:
1.自动清除临时文件。
2.自动备份文档,包括“我的文档”中的文件和Outlook Express中的邮件。
3.对于备份的文件,需要进行压缩,并将压缩文件以日期命名,放置在指定位置。
4.生成一个备份报告。
5.完成后自动关机。
以下是实现上述功能的代码:
//第一步:copy自身到C: 并在桌面上创建快捷方式
WshShell = WScript.CreateObject("WScript.Shell");
str="\""+WScript.ScriptFullname+"\" c:\\shutdown.js"
WshShell.Run("cmd /c copy "+str,0); //把本whs脚本拷贝到c:\shutdown.js
DesktopPath = WshShell.SpecialFolders("Desktop");//获得桌面实际路径
Shortcut1 = WshShell.CreateShortcut(DesktopPath + "\\关机.lnk"); //开始创建快捷方式
Shortcut1.TargetPath = "c:\\shutdown.js";
Shortcut1.Save();


//第二步:清除本用户的临时文件夹
envObj = WshShell.Environment("USER");
tmp=WshShell.ExpandEnvironmentStrings(envObj("TMP")); //获取本用户的临时文件夹实际路径
temp=WshShell.ExpandEnvironmentStrings(envObj("TEMP"));//获取本用户的临时文件夹实际路径

fso = new ActiveXObject("Scripting.FileSystemObject");
//fso.DeleteFolder(tmp,true ); //开始删除(如果临时文件夹系统在用,会删除失败!)
//fso.DeleteFolder(temp,true );

提示:读者可以自行添加需要删除的其它文件夹,以满足自己的实际情况


//第三步://创建以时间为后缀的备份文件夹
var newDate = new Date();
bakfolder="c:\\bak_"+newDate.getYear()+"年"+(newDate.getMonth()+1)+"月"+newDate.getDate()+"日_"+newDate.getHours()+"时"+newDate.getMinutes()+"分"+newDate.getSeconds()+"秒" ;
fso.CreateFolder(bakfolder);

提示:读者也可以直接指定一个固定的文件夹,将备份文件放在固定文件夹中。

//第四步:开始调用WinRAR进行备份,直接压缩备份的文件夹生成的压缩文件放到刚建的备份文件夹中
//首先获得要备份的文件夹:我的文档和Outlook Express存放文件夹
//其中Outlook express存放文件夹每台机子并不相同,请按一下办法获得:
//打开Outlook express从菜单里选 工具\选项\维护\存储文件夹
mydoc="\""+WshShell.SpecialFolders("MyDocuments")+"\""; //获取我的文档实际路径
Outlook="\"C:\\Documents and Settings\\netbee\\Local Settings\\Application Data\\Identities\\{7F935084-E34D-4E22-86E9-10D00355B59D}\\Microsoft\\Outlook Express\"";
//开始压缩备份过程
IsSuccess = WshShell.Run ("WinRAR.exe a -r \""+bakfolder+"\\doc.rar\" "+mydoc ,1, true);
//IsSuccess = WshShell.Run ("WinRAR.exe a -r \""+bakfolder+"\\Outlook.rar\" "+Outlook ,1, true)

提示:读者可以自行添加其它需要备份的目录,以满足自己的需求。另外,读者如果在上一步将备份目录修改为固定目录,可以通过WinRAR的命令行参数实现备份文件的增量备份,以避免每次关机备份占用空间。由于篇幅所限,这里不一一列举WinRAR的相关命令参数,请读者自行查阅WinRAR帮助文件。
//第五步:在备份文件夹中创建报告,内容包括:备份日期和时间,备份后文件名以及备份文件的大小。最后显示报告内容。
reportfile=bakfolder+"\\repot.txt";
tf = fso.CreateTextFile(reportfile, true);
tf.WriteLine("************备份报告**************") ;
tf.WriteLine("备份日期: "+newDate.toLocaleString()) ;
tf.WriteLine("我的文档备份文件名:"+bakfolder+"\\doc.rar 文件大小:"+fso.GetFile(bakfolder+"\\doc.rar").size+"字节") ;
//tf.WriteLine("Outlook备份文件名:"+bakfolder+"\\Outlook.rar 文件大小:"+fso.GetFile(bakfolder+"\\Outlook.rar").size+"字节") ;
tf.WriteLine("---------------------------------") ;
tf.WriteLine("关闭此文件开始关闭计算机") ;
tf.Close();
WshShell.Run("notepad.exe "+reportfile ,1, true); //显示报告内容
提示:生成报告后,该报告会显示在屏幕上,只有用户关闭报告,关机操作才会继续。如需直接关机,请读者参阅本文第一部分第二个实例。

最后,我们希望这个脚本在我们注销或者关机时自动执行,只要在组策略中指定在注销时使用这个脚本就可以了。具体方法是运行“gpedit.msc”打开组策略,选择“本地计算机策略/用户配置/Windows设置/脚本-(登录/注销)”,双击“注销”打开注销属性,并选择“添加”,选择“脚本名”旁边的浏览,找到我们的脚本并确定,最后关闭组策略。现在关机试试吧!1
[ Last edited by HUNRYBECKY on 2007-2-27 at 10:12 PM ]

   此帖被 +12 点积分       点击查看详情   
评分人:【 redtek 分数: +12  时间:2007-2-27 21:44


2007-2-27 21:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  

  要是能添加删除变量或编辑变量的功能就更好了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-2-27 21:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 5 楼』:  

不错的东东!

2007-2-27 21:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:  

非常精彩的帖子,欣赏+狂顶+珍藏!!!



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-2-27 21:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
voiL
中级用户





积分 384
发帖 189
注册 2005-10-19
状态 离线
『第 7 楼』:  

需不需要注销或重启才能生效呢????

2007-2-27 23:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 8 楼』:  

N x

2007-2-27 23:50
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 9 楼』:  

直接写到那里,当然重启不去掉了……
一般是临时需要的变量。。。set就可以了。

2007-2-28 01:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 10 楼』:  

直接写入注册表也一样。。位置:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment

建议用set和注册表配合,这个不是即时生效。用set临时用,写入注册表的注销后就可以用了。

VBS那个是立即生效的。

[ Last edited by slore on 2007-2-27 at 01:09 PM ]

2007-2-28 02:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsion
高级用户




积分 789
发帖 310
注册 2004-9-2
状态 离线
『第 11 楼』:  

不错,学习一下。

2007-2-28 02:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by namejm at 2007-2-27 21:31:
  要是能添加删除变量或编辑变量的功能就更好了。

这个还没研究过,嘿嘿,直接改注册表吧




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2007-2-28 07:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 13 楼』:  

楼上的老大,VBS可以调用画图来转换图片格式吗

2007-2-28 07:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by everest79 at 2007-2-28 07:13:
楼上的老大,VBS可以调用画图来转换图片格式吗

楼上的老大,搜索下再问。答案是可以




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2007-2-28 08:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by electronixtar at 2007-2-27 18:00:


这个还没研究过,嘿嘿,直接改注册表吧

Set WshShell = Wscript.CreateObject("Wscript.Shell")
Set WshSysEnv = WshShell.Environment("SYSTEM")
WshSysEnv.Remove(变量名)

   此帖被 +17 点积分       点击查看详情   
评分人:【 electronixtar 分数: +17  时间:2007-2-28 13:41


2007-2-28 10:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: