|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Рекурсивный обход папок в WSH на JS |
|
VBS/WSH/JS - [решено] Рекурсивный обход папок в WSH на JS
|
Новый участник Сообщения: 3 |
Профиль | Отправить PM | Цитировать Задача: Есть папка, в которой присутствует некоторое неограниченное количество подпапок. Надо обойти их все и вывести на экран названия.
Проблема: Сделал такой вот скрипт, который вызывает рекурсивную функцию, но почему-то он обходит дерево подпапок только до первого листа, а потом заканчивает работу в штатном режиме, без каких-либо ошибочных кодов. Подскажите, где я ошибаюсь: //объект файловой системы var fso = new ActiveXObject("Scripting.FileSystemObject"); //путь к каталогу, откуда запускается скрипт var path = WScript.ScriptFullName.substr(0, (WScript.ScriptFullName.length - WScript.ScriptName.length)), p = fso.GetFolder(path); //Вызываем рекурсивную функцию sFolders(path); //Собственно рекурсивная функция function sFolders(folder)//полный путь { //доступ к объекту-папке root = fso.GetFolder(folder); //Коллекция подпапок sfCount = root.SubFolders.Count; //последовательность подпапок seq = new Enumerator(root.SubFolders) WScript.Echo("\nКоличество подпапок в корневой папке (" + root + ") = " + sfCount) //если в текущей папке есть подпапки, то вызываем функцию для каждой подпапки рекурсивно. if(sfCount > 0) for(; !seq.atEnd(); seq.moveNext()) { WScript.Echo("Путь к подпапке = " + seq.item().path) //вызываем функцию рекурсивно sFolders(seq.item().path); } } - "Тест" --- "1" ------ "1-1" --- "2" ------ "2-1" То скрипт отрабатывает вплоть до папки "1-1", а после этого заканчивает работу, т.е. создаётся ощущение, что не срабатывает метод seq.moveNext(). |
|
Отправлено: 22:51, 12-02-2011 |
Ветеран Сообщения: 1001
|
Профиль | Отправить PM | Цитировать Вот скрипт, с подобным функционалом на VBS - надеюсь поможет разобраться
|
Отправлено: 10:07, 14-02-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать Спасибо, конечно, но этот скрипт я несколько раз находил, пытаясь нагуглить решение своей проблемы. Принцип у меня тот же самый, но на JS этот способ почему-то не работает.
|
Отправлено: 20:27, 14-02-2011 | #3 |
Ветеран Сообщения: 1001
|
Профиль | Отправить PM | Цитировать petrovre,
VBS для этих целей гораздо удобней, как вы видите - для vbscript, к примеру, не нужно объявлять массив. Больше типов данных, больше готовых примеров. Для автоматизации действий в windows подходит больше именно vbscript, имхо. Начал я c JScript, полгода поработал, потом переучился на VBS |
Отправлено: 20:42, 14-02-2011 | #4 |
Ветеран Сообщения: 2726
|
Профиль | Отправить PM | Цитировать Вот рекурсия на VBS
AllDir = "P:\DDDDDD" ' --------- Полное имя рабочего каталога (без слэжа \ на конце) OutStr = AllDir + vbCrLf OutStr = OutStr + AllFolders(AllDir) MsgBox OutStr ' --------------------------------------------------------------------------- Function AllFolders(WDir) ' MsgBox WDir Rezult = "" Set F = CreateObject("Scripting.FileSystemObject").GetFolder(WDir) Set SubF = F.SubFolders For Each Folder In SubF Rezult = Rezult + WDir + "\" + Folder.Name + vbCrLf Rezult = Rezult + AllFolders(WDir + "\" + Folder.Name) Next AllFolders = Rezult End Function var AllDir = "P:\\dddddd"; //--------- Полное имя рабочего каталога (без слэжа \\ на конце) var OutStr=AllDir+"\n"; OutStr+=AllFolders(AllDir); WScript.Echo(OutStr); // --------------------------------------------------------------------------- function AllFolders(WDir) { // WScript.Echo(WDir); var F,Rezult,Folders; F=WScript.CreateObject("Scripting.FileSystemObject").GetFolder(WDir); Rezult=""; Folders=new Enumerator(F.SubFolders); for (; !Folders.atEnd(); Folders.moveNext()) { // WScript.Echo(Folders.item().Name); Rezult+=WDir+"\\"+Folders.item().Name+"\n"; Rezult+=AllFolders(WDir+"\\"+Folders.item().Name); } return Rezult; } var F,Rezult,Folders; у меня тоже не работало. |
|
------- Отправлено: 00:11, 16-02-2011 | #5 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать А ведь действительно, всё дело было в видимости переменных. Спасибо большое, megaloman! Самое обидное, что эту тонкость с видимостью я знал, но сначала решил, что ошибся где-то в алгоритме или в Enumerator и в горячке пропустил это очевидное решение.
|
Отправлено: 22:44, 20-02-2011 | #6 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Рекурсивный обход папки | Ван Рег | Скриптовые языки администрирования Windows | 7 | 05-11-2011 01:03 | |
CMD/BAT - [решено] Рекурсивный обход | Чин Хон | Скриптовые языки администрирования Windows | 2 | 22-01-2011 23:12 | |
CMD/BAT - Рекурсивный обход папки | Chargos | Скриптовые языки администрирования Windows | 1 | 30-12-2010 18:37 | |
рекурсивный спуск в таблицу | Surround | Вебмастеру | 5 | 01-06-2010 12:27 | |
[решено] Рекурсивный поиск файла | cra5h_ | AutoIt | 47 | 06-02-2010 11:38 |
|