网络路径上存在 VBScript 文件夹 returns False

VBScript FolderExists on Network Path returns False

我有一个 存在于网络上的文件夹。当我在浏览到该目录(来自 Windows 7 Enterprise x64)之前 运行 以下代码时,它 return 是错误的。当我 运行 浏览到目录后的代码时,它 return 是正确的。

Const SHAREPOINT_FOLDER = "\MyServer\sites\IT\MySite\Shared%20Documents\"

MsgBox sharePointExists()

Function sharePointExists()
  Set fso = CreateObject("Scripting.FileSystemObject")

  sharePointExists = fso.FolderExists(SHAREPOINT_FOLDER)            

  Set fso = Nothing
End Function

我还没有在任何其他 OS 上测试过这个。这是 SharePoint 2010 网站目录。同样,该文件夹确实存在并且我可以读写。如果我在 Windows Explorer 中手动浏览到它,这个脚本 returns True 直到我重新启动我的计算机。重新启动后,脚本 returns False.

对完成这项工作有什么建议吗?它是我程序的关键部分,我需要让它在不手动浏览到目录的情况下工作。

注意:我已经用 FileExists 替换了 FolderExists 并给它一个有效的文件名。 FileExists 存在同样的问题。

如果我替换 Wscript.Shell 对象并执行 shell.Run,它会毫不费力地打开文件夹。这个过程需要几秒钟(就像我手动浏览时一样),但是一旦我这样做,我每次都会得到 True。

请注意:如果此功能 运行 在我的网络之外,我希望它 return False。我不能假设它是真的(否则我根本不会检查是否存在)。此外,即使在网络上,也可能无法 100% 访问此文件夹 - 检查是否存在的另一个理由。

使用

sharePointExists = fso.FolderExists( Unescape( SHAREPOINT_FOLDER))            

Unescape(charString) 函数 returns 包含 charString 内容的字符串(Unicode 格式)。 ASCII 字符集等效项替换所有使用 %xx 十六进制形式编码的字符。以 %uxxxx 格式编码的字符(Unicode 字符)被替换为具有十六进制编码的 Unicode 字符 xxxx.

资源(reverse to the Escape function)

编辑:也许您应该重新连接到服务器的空闲连接。 Something similar as mentioned in Tao's (self)answer 这里。通过映射网络驱动器映射连接,执行任务,断开连接。

这里有两个方向可以选择我会说: 问题本身似乎是重启后网络驱动器未完全连接。如果没有详细信息,很难说出原因,但如果这是一个通过驱动器号映射的驱动器,则它在登录时可能不可用。如果您使用 windows 资源管理器访问此类驱动器,则会调用 windows api 中的一个函数来自动重新连接,但这不会通过编程访问触发。

因此,方向 1 是确保始终可以正确访问驱动器。将 GPO 更改为包含 "always wait for the network at computer startup and logon" 可能会有所帮助,或者如果您通过脚本映射它,则可能会更改映射脚本本身(添加检查、持久性是与否等)。我对你的实际设置了解不够,无法在那里提供可靠的建议。

方向 2 可以缓解脚本中的问题。如果它确实是一个映射驱动器,您只需确保在脚本中它始终通过在脚本本身中重新映射来映射。还有一种方法可以触发 api 调用 windows 以编程方式执行,但不是在 vbscript 中执行,所以我不知道这是否适合您。

我假设不仅检查失败,而且您要对该共享执行的实际操作也会失败?如果只是 FolderExists 检查失败,您也可以执行

On Error Resume Next

在真正访问和分析结果之前。

因为我需要知道共享是否真的存在(而不只是忽略我的脚本不真实的事实),我决定先将一个驱动器号映射到 SharePoint 目录 - 如果失败,我知道该文件夹并不真正存在。这样一来,我就可以自动执行检查,而且不会花费太多额外时间。此外,使用该映射驱动器,我可以使用驱动器号而不是完整的 SharePoint 路径来完成我的所有任务(复制文件)。

objNetwork.MapNetworkDrive driveLetter & ":", drivePath, false, strUser, strPassword  

我使用 username/password 因为第一次连接到 SharePoint(在 VBScript 中,而不是在 Windows 中),我遇到了身份验证错误。