我对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,我无法弄清楚发生了什么。
答案 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