扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
本篇文章的目的是编写一个改变分配给你的网络适配器的IP地址的简单的脚本。下面是我们的第一个脚本。我们把这个脚本称作ChangeIPAddress.vbs:以下是引用片段:
strComputer="."
arrIPAddress=Array("172.16.11.99")
arrSubnetMask=Array("255.255.255.0")
SetobjWMIService=GetObject("winmgmts:"&strComputer&"
ootcimv2")
SetcolNetAdapters=objWMIService.ExecQuery("Select*fromWin32_NetworkAdapterConfiguration")
ForEachobjNetAdapterincolNetAdapters
errEnableStatic=objNetAdapter.EnableStatic(arrIPAddress,arrSubnetMask)
Next 当我在我的Windows服务器上运行这个脚本的时候,这个脚本成功地把这个机器的IP地址从.45改为.99,正如在运行这个脚本之前和之后运行ipconfig命令所看到的那样。到现在为止还不错。
遗憾的是,上面的脚本虽然好用,但是,那个脚本有些“杂乱”,缺少编写良好的脚本应该有的某些东西,如变量定义、错误处理、使用输入和验证输出等。因此,让我们增加这些因素“清理”一下我们的脚本。沿着这个思路,我们将学习更多的有关Windows脚本的基础知识。
变量定义
我们清理我们的脚本要做的第一件事情是定义我们的脚本中使用的变量。虽然VBScript让你简单地在一个语句中使用它们从而含蓄地定义变量,但是,在你的脚本一开始的时候明确宣布这些变量总是一个好主意。宣布一个变量告诉VBScript这个变量的存在,这样VBScript就可以为它分配内存。为什么宣布变量是一个好主意?在一个长的脚本中,你可能会有一两次拼写错误,如果你把一个变量的名字写错了,你的脚本就不会按照预期的那样运行。但是,如果你在脚本的开头明确宣布了变量,以后脚本中出现的含蓄定义的变量(如拼写错误产生的变量)都将产生一个运行时间错误。这种错误能够帮助你找到拼写错误和修复你的脚本的毛病。
如果你在我们的ChangeIPAddress.vbs 脚本的开头仅增加这个语句,然后从命令行开始运行这个脚本,你将得到如下结果:
以下是引用片段:
C:DocumentsandSettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs
Microsoft(R)WindowsScriptHostVersion5.6
Copyright(C)MicrosoftCorporation1996-2001.Allrightsreserved.
C:DocumentsandSettingsAdministrator.DC-1DesktopChangeIPAddress.vbs(2,1)MicrosoftVBScriptruntimeerror:Variableisundefined:'strComputer'
VBScript在这里说的(而不是Windows脚本主机为运行VBScript脚本注册的脚本引擎说的)是在我们的脚本的第二行有一个错误。第二行里有什么?就是这个:
现在我们已经从我们的脚本中删除了拼写错误(希望如此)。当我们运行修改后脚本时,脚本发挥作用了。
但是,如果还是不好用,怎么办?例如,如果我们修改了脚本要在远程计算机上运行,而不是在本地计算机上运行(我在未来的文章中将说明如何做),但是,远程计算机没有在网络上,我们还怎么办?再说一次,运行时间错误出现并且脚本停止运行并显示类似于我们在上面显示的错误信息,这当然是一件好事。但是,如果我们编写一个要实施许多活动的脚本该怎么办?在这种情况下,我们可能不需要一个运行时间错误来终止脚本运行,我们可能需要这个脚本继续运行,这样,这个脚本至少可以完成它要完成的其它任务。一个好的例子是一个监视许多台计算机的设置但是并不修改这些设置的脚本。在这种情况下,即使有一台或者更多的计算机不存在,你也要这个脚本继续运行。
处理运行时间错误的最简单的方法是当它们出现的时候忽略它们。你可以在你的脚本的开头附近增加下列语句告诉VBScript做这个事情:
以下是引用片段:
OnErrorResumeNext
增加这个语句的最佳位置是在“Option Explicit”后面。那么,我们的脚本就这样做吧。当然,关于错误处理你还有时间做更多的事情。例如,你要检查在你的脚本的某些点上是否存在运行时间错误的状况(如在设法连接到远程计算机的WMI服务之后)。这样,你就可以验证脚本要执行的某些行动是否成功地执行了。然后,根据这个错误状况的测试结果,你可以决定这个脚本应该做什么。例如,如果发生一个错误,你可以反馈一个“X计算机没有找到”的信息,然后继续执行脚本。我们在这个系列讲座的以后的文章中将详细介绍错误处理问题。但是,现在,我们仅增加上述语句,说明忽略出现的任何运行时间错误。
当我们要运行这个脚本指定IP地址而不是把IP地址在我们的脚本中硬性指定为172.16.11.99的时候,我们要为这台机器指定新的IP地址该如何做?在这种情况下,我们要做的事情是修改这个脚本,当我们运行这个脚本的时候,能够让我们提供用户输入。
这样做的好方法是当我们从命令行运行这个脚本的时候,我们是否能够提供参数。例如,输入ChangeIPAddress.vbs 172.16.11.188应该能把我们网络适配器的IP地址改为172.16.11.188等等。下面是如何修改我们的脚本。我们可以这样做:以下是引用片段:
OptionExplicit
OnErrorResumeNext
DimobjWMIService
DimobjNetAdapter
DimstrComputer
DimstrAddress
DimarrIPAddress
DimarrSubnetMask
DimcolNetAdapters
DimerrEnableStatic
IfWScript.Arguments.Count=0Then
Wscript.Echo"Usage:ChangeIPAddress.vbsnew_IP_address"
WScript.Quit
EndIf
strComputer="."
strAddress=Wscript.Arguments.Item(0)
arrIPAddress=Array(strAddress)
arrSubnetMask=Array("255.255.255.0")
SetobjWMIService=GetObject("winmgmts:"&strComputer&"
ootcimv2")
SetcolNetAdapters=objWMIService.ExecQuery("Select*fromWin32_NetworkAdapterConfigurationwhereIPEnabled=TRUE")
ForEachobjNetAdapterincolNetAdapters
errEnableStatic=objNetAdapter.EnableStatic(arrIPAddress,arrSubnetMask)
Next 让我们分解阅读这个脚本。首先,我们宣布了一个新的变量:
让我们分解阅读这个脚本。首先,我们宣布了一个新的变量:
这是一个字符串变量,将包含我们在运行这个脚本时指定的参数(IP地址)。接下来,在我们宣布变量的段落后面,我们增加了下面几行:
以下是引用片段:
IfWScript.Arguments.Count=0Then
Wscript.Echo"Usage:ChangeIPAddress.vbsnew_IP_address"
WScript.Quit
EndIf 这几行是做什么的?这个WScript对象的参数的属性返回我们运行一个脚本的时候指定的参数集。这个Count(计数)方法返回我们输入的参数数量。这一段代码做的事情是查看我们是否忘记了输入任何参数(参数数字等于零)。如果是这样的话,它显示一条信息,告诉我们如何正确使用这个脚本,然后,这个脚本没有继续运行就退出了。
最后,看一下前面的一行:
以下是引用片段:
arrIPAddress=Array("172.16.11.93") 在这里,我们要分配的硬性编码的新的IP地址现在已经被下面两行取代了:以下是引用片段:
strAddress=Wscript.Arguments.Item(0)
arrIPAddress=Array(strAddress)
第一行采用WScript.Arguments集的第一项(零项),并把它分配给这个字符串变量strAddress。第二项采用这个strAddress,并把它分配给arrIPAddress阵列的第一个因素。
让我们看一下,当我们运行这个新的脚本时会发生什么事情。首先运行没有指定参数的脚本,然后运行有一个参数的脚本:
以下是引用片段:
C:DocumentsandSettingsAdministrator.DC-1Desktop>ipconfig
WindowsIP设置
以太网适配器局域网连接:
具体连接DNS后缀.:
IP地址............:172.16.11.31
子网掩码...........:255.255.255.0
默认网关.........:172.16.11.1
C:DocumentsandSettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs
Microsoft(R)WindowsScriptHostVersion5.6
Copyright(C)MicrosoftCorporation1996-2001.Allrightsreserved.
用途:ChangeIPAddress.vbs新IP地址
C:DocumentsandSettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs172.16.11.188
Microsoft(R)WindowsScriptHostVersion5.6
Copyright(C)MicrosoftCorporation1996-2001.Allrightsreserved.
C:DocumentsandSettingsAdministrator.DC-1Desktop>ipconfig
WindowsIP设置
以太网适配器局域网连接:
具体连接DNS后缀.:
IP地址............:172.16.11.188
子网掩码...........:255.255.255.0
默认网关.........:172.16.11.1
验证输出
下一步,在运行我的脚本看它是否按照我的预期去做之后,我输入ipconfig有点累了。不这样做,有没有其它检查这个脚本结果的方法?是的,有!注意我们的脚本的下面几行:
以下是引用片段:
ForEachobjNetAdapterincolNetAdapters
errEnableStatic=objNetAdapter.EnableStatic(arrIPAddress,arrSubnetMask)
Next 虽然这个代码的目的是改变使用objNetAdapter.EnableStatic方法分配给这个网络适配器的IP地址,但是,我在本系列文章以前发表的文章中指出,我们需要使用一个err-变量(在这里是errEnableStatic) 作为在这个方式运行的时候存储返还的错误代码的地方。在这里的MSDN可以找到Win32_NetworkAdapterConfiguration Class(Win32网络适配器配置类)的EnableStatic方式返还的可能的错误代码列表,从这个代码列表中,我们能够看到返还的代码0意味着这个操作成功了(也就是说网络适配器的IP地址成功地改变了)。检查这一项的最简单的方法是在我们的脚本的结尾增加这样一行以返回这个错误代码:
Wscript.Echo errEnableStatic
让我们再次运行我们的脚本并且看看这个:
以下是引用片段:
C:DocumentsandSettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs172.16.11.237
Microsoft(R)WindowsScriptHostVersion5.6
Copyright(C)MicrosoftCorporation1996-2001.Allrightsreserved.
0
C:DocumentsandSettingsAdministrator.DC-1Desktop>ipconfig Windows IP 设置
以太网适配器局域网连接,具体连接DNS后缀:
以下是引用片段:
IP地址............:172.16.11.237
子网掩码...........:255.255.255.0
默认网关.........:172.16.11.1 够了, 一个0的错误代码指出,这个IP地址成功地改变了。一个更好的方法是显示一个信息而不是用下列语句代替返还的语句:
以下是引用片段:
IferrEnableStatic=0Then
Wscript.Echo"Adapter'sIPaddresshasbeensuccessfullychangedto"&strAddress
Else
Wscript.Echo"Changingtheadapter'saddresswasnotsuccessful.Errorcode"&errEnableStatic
EndIf 让我们把这个增加到我们的脚本的结尾处并且设法运行这个脚本二次,一次使用适当的IP地址,一次使用没有意义的IP地址:以下是引用片段:
C:DocumentsandSettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs172.16.11.173
Microsoft(R)WindowsScriptHostVersion5.6
Copyright(C)MicrosoftCorporation1996-2001.Allrightsreserved. 适配器的IP地址已经成功地改为172.16.11.173以下是引用片段:
C:DocumentsandSettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs172.16.11.1492567
Microsoft(R)WindowsScriptHostVersion5.6
Copyright(C)MicrosoftCorporation1996-2001.Allrightsreserved. 适配器地址的转变没有成功。错误代码70以下是引用片段:
C:DocumentsandSettingsAdministrator.DC-1Desktop>
结论
我们清理我们的脚本要做的最后一件事情是增加一些说明以便存档我们的脚本。这是一个好主意。因此,当你一年以后从工具箱里取出这个脚本要使用它或者进行修改的时候,你可以很快知道这个脚本是要做什么的。下面是我们清理之后的这个用于改变我们机器上的网络适配器IP地址的最终版本的脚本:以下是引用片段:
=========================
'NAME:ChangeIPAddress.vbs
'
'AUTHOR:MitchTulloch
'DATE:October2006
'
ARGUMENTS:
'1.new_IP_address
'=========================-
OptionExplicit
OnErrorResumeNext
DimobjWMIService
DimobjNetAdapter
DimstrComputer'可以指定IP地址或者主机名称或者FQDN
DimstrAddress'包含新的IP地址
DimarrIPAddress
DimarrSubnetMask
DimcolNetAdapters
DimerrEnableStatic
'检查漏掉的参数
IfWScript.Arguments.Count=0Then
Wscript.Echo"Usage:ChangeIPAddress.vbsnew_IP_address"
WScript.Quit
EndIf
strComputer="."
strAddress=Wscript.Arguments.Item(0)
arrIPAddress=Array(strAddress)
arrSubnetMask=Array("255.255.255.0")
SetobjWMIService=GetObject("winmgmts:"&strComputer&"
ootcimv2")
SetcolNetAdapters=objWMIService.ExecQuery("Select*fromWin32_NetworkAdapterConfigurationwhereIPEnabled=TRUE")
ForEachobjNetAdapterincolNetAdapters
errEnableStatic=objNetAdapter.EnableStatic(arrIPAddress,arrSubnetMask)
Next
'显示结果或者错误代码
IferrEnableStatic=0Then
Wscript.Echo"适配器的IP地址已经成功地改变为"&strAddress
Else
Wscript.Echo"适配器的地址改变没有成功。错误代码"&errEnableStatic
EndIf
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者