1

Тема: VBS:Перебор элементов массива объектов, заполненного с помощю рекурсии

Решил я написать программу для сравнения двух папок и если в одной из них не достаёт вложенных папок или файлов, имеющихся в другой, то она дополняется ими соответственно. В конечном итоге получится что-то вроде инструмента проводника "Портфель" в ОС Windows, но с расширенными возможностями.

Реализовывать я начал так:

  • создаём массив объектов всех вложенных папок и файлов, содержащихся в папке № 1;

  • создаём массив объектов всех вложенных папок и файлов, содержащихся в папке № 2;

  • сравниваем оба этих массива и дополняем недостоющими элементами соответственно.

Но в самом начале (при создании массива объектов всех вложенных папок и файлов, содержащихся в папке № 1) столкнулся с непредвиденной проблемой.

Код следующий:

dim i, maxI
dim objectsBufer(1000)
dim put
i = 1
allFoldersBufer("C:\папка1")
function allFoldersBufer(allDir)
 set f = createObject("scripting.fileSystemObject").getFolder(allDir)
 set subF = f.subFolders
 for each folder in subF
  set objectsBufer(i) = folder
  i = i + 1
  allFoldersBufer(allDir & "\" & folder.name)
 next
end function
maxI = i

put = "C:\Результат работы.txt"
set fso = createObject("scripting.fileSystemObject")
if fso.fileExists(put) then
 set file = fso.getFile(put)
 set textSte = file.openAsTextStream(2, -1)
else
 set textSte = fso.createTextFile(put)
end if

i = 1
msgBox "i = " & i & "     maxI = " & maxI
for i = 1 to maxI
textSte.writeLine objectsBufer(1).path & "     Имя папки: " & objectsBufer(1).name
next
textSte.close

Прошу обратить внимание на третью снизу строку: если в ней заменить константу 1 на переменную i то интерпретатор выдаёт ошибку (код 800А01А8, описание: Требуется объект: "). Описание почему-то заканчивается двойной кавычкой, поэтому не понятно какой-такой объект требуется... Если я подставляю числовые константы - как по маслу, а стоит заставить интерпритатор перебирать массив - ошибка! Почему так?

2

Re: VBS:Перебор элементов массива объектов, заполненного с помощю рекурсии

Реализовывать я начал так:

  • создаём массив объектов всех вложенных папок и файлов, содержащихся в папке № 1;

  • создаём массив объектов всех вложенных папок и файлов, содержащихся в папке № 2;

  • сравниваем оба этих массива и дополняем недостоющими элементами соответственно.

Используйте словарь (коллекцию) — «Scripting.Dictionary».

Код следующий:

Начните с добавления «Option Explicit» в начало кода и объявления всех переменных.

  • Нумерация массива начинается не с единицы, а с нуля.

  • Нет нужды проверять существование файла, если Вы всё одно собираетесь его переписывать. Можно обойтись одним методом «.CreateTextFile()».

  • А вот существование папки проверить надо.

  • Располагайте функцию за телом основной части.

  • Если функция ничего не возвращает — это процедура, а не функция.

Прошу обратить внимание на третью снизу строку: если в ней заменить константу 1 на переменную i то интерпретатор выдаёт ошибку (код 800А01А8, описание: Требуется объект: "). Описание почему-то заканчивается двойной кавычкой, поэтому не понятно какой-такой объект требуется... Если я подставляю числовые константы - как по маслу, а стоит заставить интерпритатор перебирать массив - ошибка! Почему так?

Потому что Вы находите N вложенных папок, а перебираете в цикле N+1. Естественно, в N+1 по счёту, пустом, элементе массива не будет объекта. Отсюда и ошибка. Т.е., в начале должно быть «i = 0», а при переборе — «For i = 0 To maxI - 1» как минимум.

P.S. Настоятельно рекомендую завязывать с массивами для данной задачи. Используйте словарь/коллекцию.

3

Re: VBS:Перебор элементов массива объектов, заполненного с помощю рекурсии

tIRyamPaKa2,
1) Поправьте пожалуйста заголовок темы в соответствии с пунктом правил 3.1.

2) Предполагаю, что Вашу задачу можно решить проще. На другом форуме обсуждался вариант: Батник для копирования только новых файлов.

Человек таким образом обновлял каталог проекта. Возможно то решение подойдёт больше ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4 (изменено: Yury, 2014-12-12 00:40:50)

Re: VBS:Перебор элементов массива объектов, заполненного с помощю рекурсии

tIRyamPaKa2 пишет:

вроде инструмента проводника "Портфель" в ОС Windows

Похоже, что "Портфель" отсутсвует в Windows 8 и Windows 8.1. Работая в этих ОС, я не находил в контекстном меню "Создать" пункта "Портфель".


Xameleon пишет:

Предполагаю, что Вашу задачу можно решить проще.

Поддерживаю данный тезис. Вот, например, всего одна строка в пакетном файле, и в обеих папках всё встанет на свои места:

@for /f "tokens=1-4 delims=|" %%i in ("robocopy|C:\Test|D:\Test|/dcopy:t /e /xo") do @%%i "%%j" "%%k" %%l& %%i "%%k" "%%j" %%l

.