2015-02-23 83 views
1

我有一个文件夹,确实存在于网络上。在浏览到该目录(从Windows 7 Enterprise x64)之前运行以下代码时,它将返回False。浏览到目录后运行代码时,它将返回True。网络路径上VBScript FolderExists返回False

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替换了FolderExists并为其指定了一个有效的文件名。 FileExists存在同样的问题。

如果我替换一个Wscript.Shell对象并执行一个shell.Run,​​它会毫无问题地打开该文件夹。这个过程需要几秒钟的时间(就像我手动浏览它时一样),但是一旦我这样做,我就会每次都变为True。

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

回答

0

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

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

我使用用户名/密码,因为(而不是在Windows中的VBScript),我得到了一个身份验证错误的第一个连接到SharePoint。

0

使用

sharePointExists = fso.FolderExists(Unescape(SHAREPOINT_FOLDER))    

Unescape(charString)函数返回一个字符串(Unicode格式),其中包含的charString内容。 ASCII字符集等同替换用%xx十六进制格式编码的所有字符。以%uxxxx格式(Unicode字符)编码的字符被替换为十六进制编码为xxxx的Unicode字符。

资源(reverse to the Escape function)

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

+0

谢谢你的提示,但是这并没有解决我的问题:(我仍然会False,除非我先手动浏览到这个文件夹。 – RalphyZ 2015-02-23 14:45:55

0

有两个方向你可以选择在这我会说: 看来问题本身就是网络驱动器重新启动后没有完全连接。没有细节,很难说为什么,但如果这是例如通过驱动器盘符映射的驱动器,则它可能在登录时不可用。如果您使用Windows资源管理器访问这样一个驱动器,将会调用windows api中的一个函数来自动执行重新连接,但这不会通过编程访问来触发。

方向1因此将确保驱动器始终正确可访问。将GPO更改为包含“在计算机启动和登录时始终等待网络”可能会有所帮助,或者如果您通过脚本映射此映射,则可能会更改映射脚本本身(添加检查,持久性有vs无等)。我不太了解你的实际情况,在那里提供可靠的建议。

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

我认为不仅检查失败,而且您想要在该共享上执行的实际操作也会失败?如果只有FolderExists检查失败,您也可以在真正的访问和分析结果之前执行

On Error Resume Next