vbscript путь ошибки не найден при использовании метода movefolder

63
8

Я новичок в vbscript и пытаюсь написать сценарий, который будет собирать папки с отметками месяца и года (2012_04) и переместить их в папку с отметкой года (2012). Я получаю ошибку Path not found, хотя, когда я пытаюсь переместить папку, и я не могу найти ответ нигде относительно того, почему это происходит.

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.MoveFolderName, ArchiveP & foldName, и я не могу понять, что происходит.

спросил(а) 2013-12-07T01:55:00+04:00 7 лет, 6 месяцев назад
1
Решение
63

Ошибка, которую вы получаете, вызвана неправильными путями. То, что вы пытаетесь сделать, выглядит примерно так:

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, который правильно обрабатывает разделители путей.

Ваш код довольно запутан, BTW. Вместо использования индексированного доступа к 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

ответил(а) 2013-12-07T18:00:00+04:00 7 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема