手机
当前位置:查字典教程网 >脚本专栏 >vbs >运行脚本之前,如何确定计算机上的默认脚本宿主的代码
运行脚本之前,如何确定计算机上的默认脚本宿主的代码
摘要:问:您好,脚本专家!我知道,在运行脚本时,可使用代码确定脚本是否在WScript或CScript中运行。但我想不明白的是:运行脚本之前,如何...

问:

您好,脚本专家!我知道,在运行脚本时,可使用代码确定脚本是否在WScript或CScript中运行。但我想不明白的是:运行脚本之前,如何确定计算机上的默认脚本宿主?

--AT

答:

您好,AT。您知道,人们完全难倒脚本专家并不是常事;不过我们不得不承认这个问题的确有点挑战性。(嗯,嗯:那么,或许它并不足以能够难倒脚本专家;老实说,事实上它相当简单。不过你们无需知道这些。)我们还不知道如何回答这个问题,但我们知道,为了帮助您解决这个问题,我们将会需要大量辛勤的工作和奉献。

但是,在困难面前,脚本专家放弃过吗?嗯,事实上,我们放弃过。不过,在处理一些毫不相关的事情时,我们却意外发现了答案。以下这个脚本(使用有点迂回的方法)将告诉您计算机上的默认脚本宿主:

复制代码 代码如下:

ConstHKEY_CLASSES_ROOT=&H80000000

strComputer="."

SetobjRegistry=GetObject("winmgmts:"&strComputer&"rootdefault:StdRegProv")

strKeyPath="VBSFileShellOpenCommand"

objRegistry.GetExpandedStringValueHKEY_CLASSES_ROOT,strKeyPath,vbNullString,strValue

strValue=LCase(strValue)

IfInStr(strValue,"wscript.exe")then

Wscript.Echo"WScript"

Else

Wscript.Echo"CScript"

EndIf

从中可以看出,有关默认脚本宿主的信息存储在注册表中,尽管不是处在特别明显的位置。您所需要做的只是打开HKEY_CLASSES_ROOT,找到注册表项VBSFileShellOpenCommand,然后查看默认值。(默认值是个例外的未命名的注册表值,该注册表值在Regedit中以“(默认)”的形式出现。)“(默认)”的值将是脚本宿主可执行程序的路径(例如,%SystemRoot%System32WScript.exe)。换句话说,可执行程序文件将告诉您默认脚本宿主是CScript还是WScript。

那么,实际上我们如何获得该值呢?嗯,我们首先定义一个名为HKEY_CLASSES_ROOT的常量,并将其值设定为&H80000000;这会告诉脚本我们要使用哪个注册表配置单元。然后,连接到本地计算机上的WMI服务(尽管我们可轻而易举地对远程计算机运行该脚本),务必绑定到rootdefault命名空间。(大多数WMI脚本使用rootcimv2命名空间,但是出于某些原因,系统注册表提供程序还是位于rootdefault中。可能是住房较便宜或是学校较好的原因吧。)

进行连接后,我们创建名为strKeyPath的变量,并为其分配值VBSFileShellOpenCommand。此时,我们准备从注册表中读取该值。

什么?难道我们忘了什么事情?不,我们未忘记任何事情。(尽管现在您提到它,但我们却有点想知道在我们早上离开屋子的时候是否有人将炉子关闭。)您说对了,在大多数WMI注册表脚本中,我们需要将值分配给两个变量,一个代表注册表项,另一个代表注册表项中所需的值。不过,在本例中,我们不需要创建在其中存储注册表值名称的变量。为什么不能呢?因为,从技术角度来说,“(默认)”值实际上并没有名称;它们只不过是默认值而已。我们最终所要做的是告诉该脚本从此特殊的注册表项中读取Null值。这听起来似乎不是很好的计划,不过幸运的是,“注册表提供程序”将知道这意味着读取“(默认)”值。

事实上,当谈到这个主题时,以下该行代码便可为我们检索值:

objRegistry.GetExpandedStringValueHKEY_CLASSES_ROOT,strKeyPath,vbNullString,strValue

因为“(默认)”碰巧具有REG_EXPAND_SZ数据类型,所以我们调用GetExpandedStringValue方法,传递四个参数:

?HKEY_CLASSES_ROOT,告诉脚本要使用哪个注册表配置单元的常量。

?strKeyPath,告诉脚本要使用哪个注册表项的变量。

?vbNullString,一个代表Null值的VBScript常量。这是我们通常插入代表值名称变量之处,不过正如我们说过的,这次我们的值没有名称。

?strValue,一个“输出”参数。GetExpandedStringValue需要用一个地方来存储其从注册表中读取的值;输出参数只是一个占位符变量,可在其中存储值。

GetExpandedStringValue可用后,我们便可使用该行代码将strValue中的所有字符更改为小写;这样做是为了更容易确定该值是否含有特殊字符串。

strValue=LCase(strValue)

最后,我们调用InStr函数,看看是否可在strValue中任何地方找到该字符串值wscript.exe。如果可以找到,则我们将回显默认脚本宿主WScript;如果没有找到,则一定意味着默认脚本宿主为CScript:

复制代码 代码如下:

IfInStr(strValue,"wscript.exe")then

Wscript.Echo"WScript"

Else

Wscript.Echo"CScript"

EndIf

这样就可以了,AT:现在,在不运行脚本的情况下,您便可确定计算机上的默认脚本宿主。(是的,我们知道您不得不运行确定默认脚本宿主的脚本…不过您找到答案了。)我们希望您能发现此脚本的用处,并希望每个人在今天都学到了重要一课:尽你所能,也无法难倒脚本专家。

嗯,除非您问我们一个无法回答的问题。但是,只要问我们可以回答的问题就绝不会难倒我们。

是的:几乎没有可能。

【运行脚本之前,如何确定计算机上的默认脚本宿主的代码】相关文章:

VBS获取重定向的URL的代码

用VBS可执行程序+Xmlhttp下载备份网上文件的代码

用VBS实现监视进程创建与删除的代码

vbs中关于计算机名的相关讨论

使用vbs脚本添加程序到自启动项的代码

运行同一目录下的可执行程序的VBS代码

用VBS记录客户机操作的代码

VBS 自动登录论坛的实现代码

vbs中使用 ADO 读取所有数据均在一行上的文本文件的代码

一个最简单的vbs类实例代码

精品推荐
分类导航