您收到的错误是由错误构建的路径引起的。你想做的是这样的:
fso.MoveFolder "C:\input\2013_03", "D:\archive\2013\2013_03"
但是,您实际上正在做的是:
fso.MoveFolder "C:\input\2013_03\", "D:\archive\2013\2013_03\"
^ ^
尾随反斜杠仅在目标路径中有效,并且仅当目标路径是parent您要将源文件夹移动到的文件夹,即您的语句应如下所示:
fso.MoveFolder "C:\input\2013_03", "D:\archive\2013\"
或者像这样:
fso.MoveFolder "C:\input\2013_03", "D:\archive\2013\2013_03"
避免通过字符串连接构建路径。这FileSystemObjects
提供了一个方法BuildPath http://msdn.microsoft.com/en-us/library/z0z2z1zt%28v=vs.84%29.aspx这将正确处理路径分隔符。
顺便说一句,你的代码相当复杂。而不是使用索引访问yearArray
您可以简单地使用 a 迭代所有元素For Each
环形。另外,您对子文件夹的迭代InputP
已经为您提供了Folder
对象。fso.GetFolder(InputP & dateFold.Name)
与以下对象完全相同dateFold
. Plus, Folder
对象带有一个Move http://msdn.microsoft.com/en-us/library/kxtftw67%28v=vs.84%29.aspx方法,因此您只需要处理目标路径。
我相信您的代码可以简化为以下内容,它应该可以满足您的要求:
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