我有一个确实的文件夹存在于网络上。当我在浏览到该目录(从Windows 7 Enterprise x64)之前运行以下代码时,它返回False。当我在浏览目录后运行代码时,它返回True。
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
我没有在任何其他操作系统上测试过这个。这是SharePoint 2010网站目录。同样,该文件夹确实存在,并且我可以读写。如果我在Windows资源管理器中手动浏览它,此脚本将返回True,直到我重新启动计算机。一旦我重新启动,脚本返回False。
有关这项工作的任何建议吗?它是我的程序的一个关键部分,我需要让它工作,而无需手动浏览目录。
注意:我已将FileExists替换为FileExists并为其指定有效文件名。 FileExists存在同样的问题。
如果我替换Wscript.Shell对象并执行shell.Run,它会毫无困难地打开文件夹。这个过程需要几秒钟(就像我手动浏览它一样),但是一旦我这样做,我每次都会得到真实。
请注意:如果此功能在我的网络外部运行,我希望它返回False。我不能认为它是真的(否则我根本就不会检查是否存在)。此外,即使在网络上,这个文件夹可能无法100%访问 - 这是检查存在的另一个理由。
答案 0 :(得分:0)
我可以说,你可以选择两个方向: 问题本身似乎是重新启动后网络驱动器没有完全连接。没有细节,很难说为什么,但如果这是一个通过驱动器号映射的驱动器,它可能在登录时不可用。如果使用Windows资源管理器访问此类驱动器,则会调用windows api中的函数自动执行重新连接,但这不会通过编程访问触发。
因此,方向1将确保驱动器始终可以正确访问。更改GPO以包括“始终在计算机启动和登录时等待网络”可能有所帮助,或者如果您通过脚本映射它,则可以更改映射脚本本身(添加检查,持久化是和否等)。我不太了解你的实际设置,在那里提供可靠的建议。
方向2将减轻脚本中的问题。如果确实是映射驱动器,您可以确保在脚本中始终通过重新映射脚本本身来映射它。还有一种方法可以以编程方式触发api调用窗口,但不会在vbscript中触发,所以我不知道这是否适合您。
我假设不仅检查失败,而且您想要在该共享上执行的实际操作也会失败?如果只有FolderExists检查失败,您也可以只执行
On Error Resume Next
在实际访问之前并分析结果。
答案 1 :(得分:0)
由于我需要知道共享是否真的存在(不仅忽略了我的脚本不真实的事实),我决定首先将驱动器号映射到SharePoint目录 - 如果失败,我知道文件夹并不存在。这样做,我可以自动执行检查,并且不需要额外的时间。此外,使用该映射驱动器,我可以使用驱动器号执行所有任务(复制文件),而不是完整的SharePoint路径。
objNetwork.MapNetworkDrive driveLetter & ":", drivePath, false, strUser, strPassword
我使用用户名/密码,因为第一次连接到SharePoint(在VBScript中,而不是在Windows中),我收到了身份验证错误。
答案 2 :(得分:-1)
使用
sharePointExists = fso.FolderExists( Unescape( SHAREPOINT_FOLDER))
Unescape(charString)
函数返回包含charString
内容的字符串(Unicode格式)。等效的ASCII字符集替换用%xx
十六进制形式编码的所有字符。以%uxxxx
格式(Unicode字符)编码的字符将替换为带有十六进制编码{Unicode}的Unicode字符。
资源(reverse to the Escape
function)
编辑:也许你应该重新连接到服务器的空闲连接。 Something similar as mentioned in Tao's (self)answer在这里。通过映射网络驱动器映射连接,执行任务,断开连接。