我有数百个用户,每个用户都已将驱动器手动映射到文件服务器上的各种位置/文件夹。
我正在将数据迁移到具有新名称的新服务器,但保持相同的文件夹结构,因此需要编写驱动器重新映射的脚本,如果它们遵循统一的映射模式,则可以使用简单的脚本来完成此操作,但是正如我所说的那样都是唯一的手动映射。
因此,我需要询问其当前映射,并将服务器名称从\ server1.ourdomain \ whatever路径更改为\ server2.ourdomain \ whatever路径等,因为该结构相当合理,我说这些路径将主要指向各种文件夹和级别深刻而复杂。
我打算使用VB脚本并将其作为GPO在用户站点上运行。
最佳答案
尝试这样的事情:
oldserver = "\\server1.ourdomain"
newserver = "\\server2.ourdomain"
Set net = CreateObject("WScript.Network")
Set drives = net.EnumNetworkDrives
For i = drives.Count - 1 To 0 Step -2
If LCase(Left(drives(i), Len(oldserver))) = oldserver Then
net.RemoveNetworkDrive drives(i-1), True, True
net.MapNetworkDrive drives(i-1), Replace(drives(i), oldserver, newserver), True
End If
Next
编辑:由于您的所有示例都附加了.ourdomain,因此我假设您一直在使用FQDN。如果还使用NetBIOS名称,则上面的脚本当然对它们不起作用。但是,您不能仅将
oldserver
缩短为\\server1
,因为这样的指令Replace(drives(i), oldserver, newserver)
会将UNC路径
\\server1.ourdomain\share
更改为\\server2.ourdomain.ourdomain\share
,这显然不起作用。从oldserver
和newserver
中都删除域部分,或者(如果要实施FQDN)使用类似以下内容的方法:domain = ".ourdomain"
oldserver = "\\server1"
newserver = "\\server2" & domain
Set net = CreateObject("WScript.Network")
Set drives = net.EnumNetworkDrives
For i = drives.Count - 1 To 0 Step -2
net.RemoveNetworkDrive drives(i-1), True, True
If InStr(1, drives(i), domain, vbTextCompare) > 0 Then
newpath = Replace(drives(i), oldserver & domain, newserver)
Else
newpath = Replace(drives(i), oldserver, newserver)
End If
net.MapNetworkDrive drives(i-1), newpath, True
Next