当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 用vbs找到映射到共享的所有驱动器并重新映射它们

VBScript
用vbs脚本来关闭 HTML 页面的代码
用vbs实现确定是否安装了某个特定的补丁
用vbs确定用户的登录名的代码
用vbs找到映射到共享的所有驱动器并重新映射它们
可以从一台远程服务器运行 SP2 安装程序Install.vbs
用vbs判断一个日期是否在指定的时段内
vbs+hta中实现在单个 onClick 参数中包括多个子例程的代码
vbs中实现启动两个应用程序,一直等到其中一个程序结束,然后关闭另一个?
用vbs实现对文本文件中的项计数
用vbs对文本文件的内容进行排序
用vbscript把 Word 文档保存为文本文件的代码
用vbs返回 Internet Explorer 的下载控件和 Applet 的列表
用vbscript合并多个文本文件的代码
用vbscript防止本地用户更改其密码
用vbs针对一个 IP 地址范围运行脚本
用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
使用vbscript脚本在表单中进行选择的代码
一个把任何文件转成批处理的vbs脚本Any2Bat.vbs
windows脚本调试howto的方法
注册表的禁用与解锁方法集合

VBScript 中的 用vbs找到映射到共享的所有驱动器并重新映射它们


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

问:
您好,脚本专家!如何找到映射到 \\server1\share 的所有启动器,并将它们重新映射到 \\server2\share?
-- H T-S
答:
你好,H T-S。您知道,不久前 Malcolm Gladwell 出版了一本书,书名为《The Tipping Point》。简单来说,该书做出了一种假设:某一事物可能在很长一段时间内被忽略,但是当这种忽略至少达到所谓的引爆点时,这个原来无人问津的事物就会忽然变成一种名副其实的时尚。就好像一夜之间它就从一件您从未听说的事物变得似乎随处可见。
这是个有趣的假设,我们似乎在用于映射和取消映射网络驱动器的脚本上看到了这种现象。我们发布“您好,脚本专家!”专栏已经一年多了,而从未提及网络驱动器,并且似乎没有人注意这个问题。然后,突然之间,关于映射和取消映射网络驱动器的问题纷至沓来。我们在几周前回答了第一个这种问题,现在又来回答另一个问题,我们有一个收件箱全都是其他关于网络驱动器的问题。先是呼啦圈,然后是喇叭裤,现在轮到网络驱动器了。自己去想吧。
那么重新映射网络驱动器如何呢?嗯,不论是好是坏,并没有可以自动重新映射网络驱动器的方法;因此,我们不得不退而求其次找出其他解决方法。但这并不是太槽糕:我们可以找到符合条件的所有驱动器,取消映射这些驱动器,然后将每个驱动器重新映射到新的位置。
当然,这听起来挺复杂,但实际上很简单。以下脚本可用来查找映射到 \\server1\share 的所有驱动器,并将这些驱动器重新映射到 \\server2\share:
Set objNetwork = CreateObject("Wscript.Network")
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count-1 Step 2
If colDrives.Item(i + 1) = "\\server1\share" Then
strDriveLetter = colDrives.Item(i)
objNetwork.RemoveNetworkDrive strDriveLetter
objNetwork.MapNetworkDrive strDriveLetter, "\\server2\share"
End If
Next
该脚本将首先创建 Wscript.Network 对象实例。我们应当注意到了,无论何时当我们要映射或取消映射网络驱动器时,都需要使用 Windows Script Host,这是因为 WMI 没有任何映射或取消映射驱动器的方法。没关系,这只不过意味着我们的脚本必须在本地计算机上运行。通常情况下都不能针对远程计算机来使用 WSH 方法。这是一个您不得不面临的限制。(有一个方法可解决此问题:将该脚本作为登录脚本运行。登录脚本将始终在本地运行。)
创建 Network 对象之后,调用 EnumNetworkDrives 方法,以便返回计算机上的所有已映射网络驱动器的集合:
Set colDrives = objNetwork.EnumNetworkDrives
这将使我们亲眼见到那个被称为已映射网络驱动器集合的奇特的小东西。今天我们就不详细介绍此集合的体系结构了,请参阅关于网络驱动器的上一个专栏。只需说明每个已映射的驱动器实际占用此集合中的两项:第一项为驱动器号,第二项为 UNC 路径。如果计算机上有三个已映射的驱动器,则集合内容将如下所示:
X:
\\server1\share1
Y:
\\server2\share2
Z:
\\server3\share3
这就是我们必须使用看起来这么奇怪的 For Next 循环来遍历集合的原因,此代码行使我们在集合中每隔一项就跳过一项,进而确保我们仅查看各个驱动器号项:
For i = 0 to colDrives.Count-1 Step 2
然后,对于每个驱动器号,我们需要确定相应的 UNC 路径是否为 \\server1\share1。请记住,如果查看集合中的 0 项(集合中的第一项的索引号为 0),则看到的是驱动器号,相应的 UNC 路径将为该索引号 (0) 加 1。因此,我们用如下代码来确定第一个驱动器是否正好被映射到 \\server1\share1:
If colDrives.Item(i + 1) = "\\server1\share" Then
让我们假定就是这样。在这种情况下,我们需要获取驱动器号(0 项),并将该值存储在名为 strDriveLetter 的变量中。然后,调用 RemoveNetworkDrive 方法来取消映射该驱动器,再调用 MapNetworkDrive 方法将同一驱动器号重新映射到新的共享:
objNetwork.MapNetworkDrive strDriveLetter, "\\server2\share"
不,这并不是所谓的“引爆点”,因为您刚刚推翻了试图遵循这一切的想法。我们知道是有点混乱,但这是由于已映射网络驱动器集合的特殊构造方式而造成的。如果这对于您没有任何意义,尽管忽略它好了,您应当看到事情整体上是有逻辑性的。也许,是有点混乱的逻辑,但仍然是逻辑。
因为这一点比较费解,所以我们举了一个最简单的例子:将名为 \\server1\share 的共享重新映射到名为 \\server2\share 的共享。当然还可以将 server1 上的任何共享重新映射到 server2 上任何名称相似的共享。但是这对于今天来说可能有点过多了。但是,如果您感兴趣,只需要让我们知道,我们会在不久以后重新关注此主题。