当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 用vbs针对一个 IP 地址范围运行脚本

VBScript
用vbs检索在运行对话框中键入的一系列命令的代码
编写可以打开文本文件并打乱在该文件中所找到的单词顺序的vbs脚本
在 HTA 中暂停脚本的方法
运行脚本之前,如何确定计算机上的默认脚本宿主的代码
用vbs实现删除名称中有撇号的文件夹
用vbs将输出内容写到屏幕以覆盖当前屏幕上的内容的方法
用vbs实现配置无人登录计算机时使用的屏幕保护程序
用vbs更改 Internet Explorer 的标题栏
用vbs读取文本文件的最后一行
用vbs实现重新启动 Internet Explorer
用vbs实现禁用服务
用vbs确定计算机是否有 USB 2.0 端口的代码
用vbs列出注册表中 Run 项中的所有项目
用vbs将名称截断以使其最多包含 16 个字符的代码
用vbs将本地文件替换为在文件服务器上找到的新版本
用vbs确定脚本正在哪一个帐户下运行
用vbs确定可移动驱动器的连接时间
用vbs记录屏幕保护程序的开始时间和结束时间
用vbs计算某个词在日志文件中的出现次数
vbs病毒的简单例子源代码解析

VBScript 中的 用vbs针对一个 IP 地址范围运行脚本


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 61 ::
收藏到网摘: n/a

问:
嗨,Scripting Guy!我想在一个子网中的所有计算机上运行脚本。有没有办法不必将所有 IP 地址都硬编码到脚本中就能完成这项任务呢?
-- RB
答:
嗨,RB。根据您在电子邮件中的描述,看来您的设置类似于:您的子网的 IP 地址范围为 192.168.1.1 到 192.168.1.254。您想创建一个脚本,可以先从第一个 IP 地址开始,在相应的计算机上运行某个代码,然后转到第二个地址,运行相同的代码,按地址顺序在每台计算机上都运行相同的脚本。此外,您想通过尽可能最少的代码行就能办到这一点,并且不必硬编码好几百个 IP 地址。
那么,有办法能做到吗?当然有,而且比您想象的还要简单。
首先,让我们向您介绍如何某个 IP 地址范围进行循环。这是一个示例代码,所以只用于回显每个 IP 地址的名称。在介绍了该脚本的工作原理后,我们将举一个更实际的例子:
复制代码 代码如下:

On Error Resume Next
intStartingAddress = 1
intEndingAddress = 254
strSubnet = "192.168.1."
For i = intStartingAddress to intEndingAddress
strComputer = strSubnet & i
Wscript.Echo strComputer
Next

不,真的,这就是整个脚本了。我们先指派了一些变量:将值“1”指派给 intStartingAddress;将值“254”指派给 intEndingAddress;并将值“192.168.1.”指派给 strSubnet。(注意“1”后面的英文句号)。正如您可能猜到的,这些值将作为建立 IP 地址的构建块。
指派了这些变量之后,我们创建了一个 For-Next 循环,用以运行 1 (intStartingAddress) 到 254 (intEndingAddress) 的变量。为何要循环 1 到 254 呢?原因很简单:那是您的 IP 范围。如果 IP 范围是 192.168.1.7 到 109.168.1.54,又该怎么办呢?没有问题:使用相同的循环,但要将intStartingAddress 的值改为“7”,并将 intEndingAddress 的值改为“54”。
在此循环中,我们将字符串值 192.168.1. 与循环变量 (i) 的当前值相串联。在首次运行循环——当“i”等于“1”时,我们将 192.168.1. 和 1 相结合。您猜怎么样?我们得到了值 192.168.1.1,恰好是第一个 IP 地址。最后一次运行循环时,我们将把 192.168.1. 和 254 相结合,从而得到最后一个 IP 地址的值——192.168.1.254。运行该脚本,将得到:
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
非常简单吧?
当然,您可能对于回显一组 IP 地址不会多感兴趣;您想运行某种 WMI 代码。好的:
On Error Resume Next
intStartingAddress = 1
intEndingAddress = 254
strSubnet = "192.168.1."
For i = intStartingAddress to intEndingAddress
strComputer = strSubnet & i
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_OperatingSystem")
For Each objItem in ColItems
Wscript.Echo strComputer & ": " & objItem.Caption
Next
Next
正如您所看到的,我们再次把 strComputer 变量的值设为某个 IP 地址。然后连接到该地址所表示的计算机上的 WMI 服务。这很容易办到,因为 WMI 既可以使用计算机名,也可以使用 IP 地址连接到计算机。
现在,我们要加入一项小技巧。您在电子邮件中提到,想要排除几个 IP 地址(可能代表路由器或其他东西)。好的。这里有一个经过修改的脚本,其使用 Select Case 语句来排除某些计算机:
intEndingAddress = 254
strSubnet = "192.168.1."
For i = intStartingAddress to intEndingAddress
Select Case i
Case 10
Case 50
Case 100
Case Else
strComputer = strSubnet & i
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_OperatingSystem")
For Each objItem in ColItems
Wscript.Echo strComputer & ": " & objItem.Caption
Next
End Select
Next
注意一下当“i”值等于 10、50 或 100 时,所发生的变化。没错:一点都没变化。如果计算机的 IP 地址为 192.168.1.10、192.168.1.50 或 192.168.1.100,不会发生任何变化;不会运行任何 WMI 代码,脚本将照样执行循环。该 WMI 代码将仅在拥有其他 IP 地址(上面三个地址除外)的计算机上执行。这是一种用以在该脚本的 WMI 部分中排除特定 IP 地址的既简单又有效的办法。