在使用脚本程序管理不同方面的Windows网络的系列文章中,作者Mitch Tulloch接下来会介绍“整理”。“整理”是用于修改网络适配器的IP地址的脚本程序的一个简单的步骤。这个技巧之前已经发布在WindowsNetworking.com。 第一篇文章《使用脚本程序管理Windows网络——基础》介绍了一些基本的脚本编写概念,如对象、方法和属性,文章写作的目的是编写一个简单的修改网络适配器IP地址的脚本。
这里我们将第一个脚本再列出,也就是ChangeIPAddress.vbs: strComputer = “.” arrIPAddress&nbs……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
在使用脚本程序管理不同方面的Windows网络的系列文章中,作者Mitch Tulloch接下来会介绍“整理”。“整理”是用于修改网络适配器的IP地址的脚本程序的一个简单的步骤。这个技巧之前已经发布在WindowsNetworking.com。
第一篇文章《使用脚本程序管理Windows网络——基础》介绍了一些基本的脚本编写概念,如对象、方法和属性,文章写作的目的是编写一个简单的修改网络适配器IP地址的脚本。这里我们将第一个脚本再列出,也就是ChangeIPAddress.vbs:
strComputer = "." arrIPAddress = Array("172.16.11.99") arrSubnetMask = Array("255.255.255.0") Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2") Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration") For Each objNetAdapter in colNetAdapters errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) Next |
当我在我的Windows服务器上执行这个脚本时,它成功地把机器的IP地址从.45修改成.99,这已经从我们在脚本执行前后运行ipconfig命令的结果可以看出。到此为止,一切都进展很好。
但不幸的是,虽然上面的脚本已经可以工作了,但是这个脚本还算不上是一个好的脚本程序,它还缺少一些重要的东西,如变量定义、错误处理、使用输入和验证输出等。所以让我们通过添加这些有用的元素来“整理”我们的这个脚本,同时在这个过程中我们将学习更多的Windows脚本编写的基础知识。
变量定义
为了整理我们的脚本,我们将做的第一件事就是定义一些我们正在使用的变量。虽然VBScript可以让我们简单地在一个使用变量的语句中隐式地定义变量,但在脚本的开关显式上声明变量一直都是很好的做法。声明一个变量会告诉VBScript变量的存在,这样VBScript可以为它分配必要的内存。为什么显式地声明变量是好的做法呢?是这样的,在一个很长的脚本程序中,你很可能会出现一两个拼写错误,这样如果你输入了错误的变量名称,你的脚本就可能会与预想的结果不一样。但如果你在脚本的开关就显式地声明了变量,那么之后的脚本中任意隐式声明的变量(拼写错误造成的)都会导致一个运行时错误,这样这些错误就可以帮助你识别出你的拼写错误从而排除脚本的错误。
为了让VBScript意识到你正在显式地声明你的脚本中的所有的变量,可以将以下的语句添加到你的脚本的开头:
Option Explicit |
如果你在我们的ChangeIPAddress.vbs脚本的开头添加了这个语句后,从命令提示符运行这个脚本,你可以得到下面的结果:
C:Documents and SettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. C:Documents and SettingsAdministrator.DC-1DesktopChangeIPAddress.vbs(2, 1) Microsoft VBScript runtime error: Variable is undefined: ’strComputer’ |
VBScript在这里告诉我们(或者是说用于运行VBScript脚本的Windows Script Host的脚本引擎告诉我们)的是在我们的脚本的第2行有一个错误。第2行是什么呢?它是:
strComputer = "." |
为什么这会产生一个运行时错误呢?因为我们正在给一个我们还没有声明的字符串的变量(strComputer)赋值。所以让我们现在为每一个我们在脚本中使用的变量增加声明:
Option Explicit Dim objWMIService Dim objNetAdapter Dim strComputer Dim arrIPAddress Dim arrSubnetMask Dim colNetAdapters Dim errEnableStatic strComputer = "." arrIPAddress = Array("172.16.11.93") arrSubnetMask = Array("255.255.255.0") Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2") Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each objNetAdapter in colNetAdapters errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) Next |
记住如果你使用了Option Explicit,那么你必须声明脚本程序中所有的变量,包括对象、字符串、数组、集合、错误代码变量等。这看起来似乎会增加许多麻烦,但相信我,一旦你的脚本增加上几页的长度后,它会对你排除越来越多的运行错误很有帮助。同样引起注意的是,声明变量的前后顺序是没有什么关系的,只需要确定声明了所有需要的变量就行。最好的做法是将你的所有变量声明都放在脚本的开头独立的部分,就像我们之前所做的一样。
错误处理
既然我们已经从我们的脚本中清除了拼写错误(希望是这样),如果我们运行修改后的脚本,它会正常地工作。但如果没有呢?比如,如果我们要修改我们的脚本使它能对远程计算机而不是本地计算机产生作用,而远程计算机又不在网络上时又会怎么样呢(我将在后面的文章解释如何做)?同样,一个运行时错误(相对于VBScript在运行之前的编译时就能发现的错误的,在脚本正在执行时发生的错误)将会产生,然后脚本会停下来并显示一个类似于之前我们看到的错误消息,当然我们也是可以进行排错的。但如果我们编写的脚本是要执行许多的动作时又会怎么样呢?在这种情况下,我们也不希望有一个运行时错误使脚本停止——我们也许希望脚本继续执行以便它至少能执行完其它应该完成的没有问题的动作。一个很好的例子是这样一个脚本,它负责监控大量的计算机的配置,但并不对这些配置作修改。在这种情况下,你会希望这个脚本一直保持运行,即使其中的一个或多个计算机已经停止工作响应。
处理运行时错误的最简单的方法是当错误发现时忽略它。你可以通过在脚本的开头附近添加以下的语句告诉VBScript应该忽略运行时错误:
On Error Resume Next |
添加这条语句的最好位置是Option Explicit之后,所以我们就这样修改我们的脚本。当然,还有几种情况你可能想做更多关于错误处理的事。比如,你也许想要在你的脚本的一些地方检查一个运行时错误的条件的存在性(如,尝试连接一个远程计算机的WMI服务之后),所以你可以验证脚本本该执行的一个特定的动作是否成功。然后,基于对错误条件的验证结果,你可以决定脚本的下一步应该怎么做。比如,如果一个错误发生后,你会输出一个消息告诉说“计算机X没有找到”,然后继续脚本的后续动作。我们将在后续的文章中详细地研究这样的错误处理,但现在我们就先添加上面的这个语句以忽略所有发生的运行时错误。
用户输入
如果我们想要在运行脚本的时才指定机器的新IP地址而不是将IP地址172.16.11.99硬编码到脚本中去。在这种情况下,我们需要做的是修改脚本以使我们运行脚本时能够提供用户输入。一个实现这个的很好的方法将是我们在命令行执行脚本时可以附加一些参数,比如输入“ChangeIPAddress.vbs 172.16.11.188”应该可以把我们的网络配置器的IP地址修改为172.16.11.188。下面就是我们为了实现这个目标而修改后的脚本:
Option Explicit On Error Resume Next Dim objWMIService Dim objNetAdapter Dim strComputer Dim strAddress Dim arrIPAddress Dim arrSubnetMask Dim colNetAdapters Dim errEnableStatic If WScript.Arguments.count = 0 Then Wscript.Echo "Usage: ChangeIPAddress.vbs new_IP_address" WScript.Quit End If strComputer = "." strAddress = Wscript.Arguments.Item(0) arrIPAddress = Array(strAddress) arrSubnetMask = Array("255.255.255.0") Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2") Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each objNetAdapter in colNetAdapters errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) Next |
让我们一处处地拆解分析这些代码。首先,我们声明了一个新的变量:
Dim strAddress |
这一个将包括参数(IP地址)的字符串变量,这个参数就是我们在运行脚本时所要指定的。下一步,我们在我们声明的部分之后添加以下的代码行:
If WScript.Arguments.count = 0 Then Wscript.Echo "Usage: ChangeIPAddress.vbs new_IP_address" WScript.Quit End If |
这些代码是做什么用的呢?WScript对象的Arguments属性返回我们在运行脚本时指定的参数集合。count方法返回我们输入的参数个数。如果参数的个数等于0,它输出(显示)一个消息告诉我们应该如何正确地使用这个脚本,然后脚本退出前停止。
最后,之前脚本中的这一行代码:
arrIPAddress = Array("172.16.11.93") |
也就是我们硬编码进去的将要赋给网络适配器的新IP地址现在已经由以下两行代码所替代:
strAddress = Wscript.Arguments.Item(0) arrIPAddress = Array(strAddress) |
第一行取出WScript.Arguments集合的第1项(0位置的项)并将它赋给字符串变量strAddress。然后第二行将这个strAddress作为第一个元素赋值给arrIPAddress数组。
让我们看看当运行这个脚本时会产生什么结果,首先不指定参数,然后指定一个参数:
C:Documents and SettingsAdministrator.DC-1Desktop>ipconfig Windows IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 172.16.11.31 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.11.1 C:Documents and SettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Usage: ChangeIPAddress.vbs new_IP_address C:Documents and SettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs 172.16.11.188 Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. C:Documents and SettingsAdministrator.DC-1Desktop>ipconfig Windows IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 172.16.11.188 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.11.1 |
这样,就对了。
验证输出
下一步,我们不想再在每次执行完脚本后都使用ipconfig去查看IP是否被修改成我想要的结果。是否有其他的方法可以检查脚本运行结果呢?是有的。注意我们脚本的下面几行:
For Each objNetAdapter in colNetAdapters errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) Next |
这些代码的目的是使用objNetAdapter.EnableStatic方法修改网络适配器的IP地址,而我在我的前一篇文章已经提到,我们需要使用一个err-参数(这里是errEnableStatic)作为存储方法运行时返回的错误代码。Win32_NetworkAdapterConfiguration 类的EnableStatic方法可能返回的一组可能的错误代码可以在MSDN上找到,而且我们可以从中知道如果返回0的错误代码表示操作已经成功完成(如这里是IP地址已经成功修改)。检查这个错误代码的最简单方法是通过在脚本的最后添加下面这行代码来输出这个错误代码:
Wscript.Echo errEnableStatic Let’s run our script again and see this: C:Documents and SettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs 172.16.11.237 Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. 0 C:Documents and SettingsAdministrator.DC-1Desktop>ipconfig Windows IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 172.16.11.237 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.11.1 |
可以确信,错误代码0表明IP地址被成功的更改。更好的一种办法是展示一个信息而不是用下面的编码来代替回应指令陈述:
If errEnableStatic=0 Then Wscript.Echo "Adapter’s IP address has been successfully changed to " & strAddress Else Wscript.Echo "Changing the adapter’s address was not successful. Error code " & errEnableStatic End If |
让我们将这些添加到我们的脚本最后,然后尝试运行脚本2次,第一次用一个正确的IP,一次使用乱写的IP:
C:Documents and SettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs 172.16.11.173 Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Adapter’s IP address has been successfully changed to 172.16.11.173 C:Documents and SettingsAdministrator.DC-1Desktop>ChangeIPAddress.vbs 172.16.11.1492567 Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Changing the adapter’s address was not successful. Error code 70 C:Documents and SettingsAdministrator.DC-1Desktop> |
结论
为了整理我们的脚本,我们将要做的最后一件事是增加一些注释来说明我们的脚本。这是一个很好做法,这可以使你在一年以后再使用或修改脚本时,你可以快速地明白它是做什么用的。下面是我们的用于修改我们机器上的网络适配器IP地址的最终整理版脚本:
’========================= ’ NAME: ChangeIPAddress.vbs ’ ’AUTHOR: Mitch Tulloch ’DATE: October 2006 ’ ARGUMENTS: ’1. new_IP_address ’=========================- Option Explicit On Error Resume Next Dim objWMIService Dim objNetAdapter Dim strComputer ’ Can specify IP address or hostname or FQDN Dim strAddress ’Contains the new IP address Dim arrIPAddress Dim arrSubnetMask Dim colNetAdapters Dim errEnableStatic ’Check for missing arguments If WScript.Arguments.count = 0 Then Wscript.Echo "Usage: ChangeIPAddress.vbs new_IP_address" WScript.Quit End If strComputer = "." strAddress = Wscript.Arguments.Item(0) arrIPAddress = Array(strAddress) arrSubnetMask = Array("255.255.255.0") Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2") Set colNetAdapters = objWMIService.execQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each objNetAdapter in colNetAdapters errEnableStatic = objNetAdapter.EnableStatic(arrIPAddress, arrSubnetMask) Next ’Display result or error code If errEnableStatic=0 Then Wscript.Echo "Adapter’s IP address has been successfully changed to " & strAddress Else Wscript.Echo "Changing the adapter’s address was not successful. Error code " & errEnableStatic End If |
作者
Mitch Tulloch是一个作家、培训师和Windows服务器操作系统、IIS管理、网络故障修复和安全方面的专业顾问。他已经写了15本书,其中包括:Microsoft Encyclopedia of Networking (Microsoft Press),Microsoft Encyclopedia of Security (Microsoft Press),Windows Server Hacks (O'Reilly),Windows Server 2003 in a Nutshell (O'Reilly),Windows 2000 Administration in a Nutshell (O'Reilly),and IIS 6 Administration (Osborne/McGraw-Hill)。Mitch居住在加拿大的Winnipeg,你可以他的网站www.mtit.com查到更多关于他的书的信息。
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
梭子鱼Web应用防火墙助力网站数据采集管理 有效预防攻击
网站数据持续地被脚本、bots病毒和其它一些自动执行的程序采集,这有时候是件好事,有时候却并非如此,通常介于两者之间。
-
使用脚本管理Windows 网络 第十三部分:返回所有值的脚本
在本系列的前一篇文章WindowsManagement Instrumentation属性中,我们编写了一个名为DisplayClassProperties.vbs的脚本,该脚本显示了WMI类中所有的属性名称。
-
使用脚本管理Windows网络(更新版)
“授人以鱼,不如授人以渔。”的确如此。而在忙碌的IT世界里,这也适用于脚本化管理:“给人一个有用的脚本,不如教他自己写脚本。”
-
使用脚本管理Windows网络 第十二部分:Windows管理检测的属性
这一章将学习如何显示Windows管理检测(WMI)类的所有属性,它是关于如何使用脚本管理Windows网络的技巧之一。