【问题标题】:"Disconnected Network Drive" in My Computer我的电脑中的“断开的网络驱动器”
【发布时间】:2015-01-28 09:17:19
【问题描述】:

我们使用 VPN 连接到工作网络。我有一个映射的网络驱动器,连接后立即在我的电脑中显示“断开的网络驱动器”。在这种状态下,我运行一个 VBA 例程:

Dim dr As String: dr = "F:\T\"
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(dr) Then
    Call fso.CreateFolder(dr)
End If

即使该文件夹确实存在,fso 认为它不存在,因此它会尝试创建该文件夹并引发错误:运行时错误 76:找不到路径。当然它找不到它,因为它处于断开状态。使用该网络驱动器的任何其他操作也会失败。

所以我打开我的电脑并手动双击网络驱动器。它连接得很好,再次运行代码时我不再收到错误。但这是有问题的。我需要代码中的解决方案来自动连接网络驱动器。

可能的解决方案 1: 只需使用 UNC 路径而不是映射的驱动器号。问题是我不知道路径是什么。我也不想使用 UNC;代码需要灵活地处理驱动器映射到的任何位置。这是来自黄铜的政策。

可能的解决方案 2: 使用 Net Use 或 WshNetwork 重新映射网络驱动器。同样,这是不可能的,因为我不知道 UNC 路径是什么或将会是什么。

可能的解决方案 3: Connect using ShellExecute 虽然这可行,但它并不真正可口,因为它会打开一个窗口来探索文件夹(可以使用 SW_HIDE 来避免显示该窗口,但接下来如何我会关闭它吗?)。此外,它不会立即连接。我需要一个不确定长度的延迟才能完成这项工作。不好回答。 MSDN ShellExecute Function

那么有更好的解决方案吗?如何在等待驱动器返回时连接驱动器并在无法连接时抛出错误?

我需要它同时适用于 VBScript 和 VBA。

【问题讨论】:

  • 您是否调查过使用 WMI 迭代映射的驱动器并连接您想要的驱动器?映射的共享是否更改无关紧要,因为您应该能够读取该信息并使用它(该信息可用,只是 Windows 尚未连接它)。
  • 你能告诉我怎么做吗?
  • This previous answer 应该可以帮助您上路。我认为您更好的选择是枚举并找到正确的映射驱动器,然后只需确定其 UNC 路径并直接使用 UNC 路径 - 这样您就不必重新连接映射驱动器。
  • 我去看看。感谢您的帮助。

标签: vba excel vbscript


【解决方案1】:

Slugster 建议获取映射的 UNC 值是一个很好的建议。这是我的解决方案,改编自 this answer 这适用于 VBScript 和 VBA。

Sub testget()
    Debug.Print getUNC("F:\T\")
End Sub

Function getUNC(dir)

    Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
    Dim sDrive: sDrive = fso.GetDriveName(dir)
    Set fso = Nothing

    Dim sMap: sMap = GetMappedDrive(sDrive)
    If sMap <> "" And sDrive <> sMap Then
        getUNC = Replace(dir, sDrive, sMap)
    Else
        getUNC = dir
    End If

End Function

Function GetMappedDrive(sDrive)
    Dim wshNetwork: Set wshNetwork = CreateObject("WScript.Network")
    Dim oDrives: Set oDrives = wshNetwork.EnumNetworkDrives
    Dim i
    For i = 0 To oDrives.Count - 1 Step 2
        If UCase(oDrives.Item(i)) = UCase(sDrive) Then
            GetMappedDrive = oDrives.Item(i + 1)
            Exit For
        End If
    Next
    Set oDrives = Nothing
    Set wshNetwork = Nothing
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多