使用movefolder方法时找不到vbscript错误路径

时间:2013-12-06 22:55:17

标签: vbscript

我对vbscript相当新,并且尝试编写一个脚本,该脚本将拾取月份和年份标记的文件夹(2012_04)并将它们移动到年份标记文件夹(2012)。虽然我试图移动文件夹时遇到路径未找到错误,但我无法在任何地方找到答案,为什么会发生这种情况。

for i = 0 to UBound(yearArray)
    Set folder = fso.GetFolder(InputP)
    Set subFold = Folder.Subfolders
    yearStamp = yearArray(i)

    if not fso.FolderExists(ArchiveP & yearStamp) then
        fso.createFolder(ArchiveP & yearStamp)
    end if

    ArchiveP = ArchiveP & yearStamp & "\"

    for each dateFold in subFold
       Set fo = fso.GetFolder(InputP & dateFold.Name)
       folderName = InputP & dateFold.name & "\"
       foldName = fo.name & "\"

       if left(foldName,4) = yearStamp then
          fso.MoveFolder folderName , ArchiveP & foldName
       end if
    next

    ArchiveP = UnChangeP & PreArchP
Next

错误发生在fso.MoveFolder folderName,ArchiveP& foldName,我无法弄清楚发生了什么。

1 个答案:

答案 0 :(得分:1)

您获得的错误是由错误构建的路径引起的。你要做的是这样的事情:

fso.MoveFolder "C:\input\2013_03", "D:\archive\2013\2013_03"

然而,你正在做的是:

fso.MoveFolder "C:\input\2013_03\", "D:\archive\2013\2013_03\"
                                ^                           ^

尾部反斜杠仅在目标路径中有效,并且仅当目标路径是要将源文件夹移动到的文件夹时,即您的语句应如下所示:

fso.MoveFolder "C:\input\2013_03", "D:\archive\2013\"

或者像这样:

fso.MoveFolder "C:\input\2013_03", "D:\archive\2013\2013_03"

避免通过字符串连接构建路径。 FileSystemObjects提供了一个方法BuildPath,可以正确处理路径分隔符。

你的代码相当复杂,顺便说一下。您可以简单地使用yearArray循环遍历所有元素,而不是使用对For Each的索引访问。此外,您对InputP子文件夹的迭代已经为您提供了Folder个对象。 fso.GetFolder(InputP & dateFold.Name)dateFold完全相同。另外,Folder个对象附带Move方法,因此您只需要处理目标路径。

我相信您的代码可以简化为以下内容,应该按照您的意愿执行:

For Each year In yearArray
  dst = fso.BuildPath(ArchiveP, year)
  If Not fso.FolderExists(dst) Then fso.CreateFolder dst

  For Each dateFold In fso.GetFolder(InputP).SubFolders
    If Left(dateFold.Name, 4) = year Then dateFold.Move dst & "\"
  Next
Next

在性能方面,切换两个循环可能是个好主意。迭代文件夹意味着你必须从磁盘读取,而yearArray在内存中,因此前一次迭代必然比后者慢。通过使子文件夹迭代成为外部循环(并将目标文件夹创建放在一个单独的循环中),您可以消除这个瓶颈,因为这样您只需读取一次子文件夹。

For Each year In yearArray
  dst = fso.BuildPath(ArchiveP, year)
  If Not fso.FolderExists(dst) Then fso.CreateFolder dst
Next

For Each dateFold In fso.GetFolder(InputP).SubFolders
  For Each year In yearArray
    dst = fso.BuildPath(ArchiveP, year)
    If Left(dateFold.Name, 4) = year Then dateFold.Move dst & "\"
  Next
Next