Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Рекурсивный обход папок в WSH на JS

Ответить
Настройки темы
VBS/WSH/JS - [решено] Рекурсивный обход папок в WSH на JS

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить 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
Благодарности: 226

Профиль | Отправить PM | Цитировать


Вот скрипт, с подобным функционалом на VBS - надеюсь поможет разобраться
Код: Выделить весь код
Set FSO = CreateObject("Scripting.FileSystemObject")
ShowSubFolders FSO.GetFolder("C:\temp")

Sub ShowSubFolders(Folder)
    For Each Subfolder in Folder.SubFolders
        Wscript.Echo Subfolder.Name
        ShowSubFolders Subfolder
    Next
End Sub

Отправлено: 10:07, 14-02-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, конечно, но этот скрипт я несколько раз находил, пытаясь нагуглить решение своей проблемы. Принцип у меня тот же самый, но на JS этот способ почему-то не работает.

Отправлено: 20:27, 14-02-2011 | #3


Ветеран


Сообщения: 1001
Благодарности: 226

Профиль | Отправить PM | Цитировать


petrovre,
VBS для этих целей гораздо удобней, как вы видите - для vbscript, к примеру, не нужно объявлять массив. Больше типов данных, больше готовых примеров. Для автоматизации действий в windows подходит больше именно vbscript, имхо. Начал я c JScript, полгода поработал, потом переучился на VBS

Отправлено: 20:42, 14-02-2011 | #4


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить 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
Вот рекурсия на JS
Код: Выделить весь код
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;
}
Всё дело в видимости переменных в JS. Пока в функции не написал:
var F,Rezult,Folders;
у меня тоже не работало.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:11, 16-02-2011 | #5


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


А ведь действительно, всё дело было в видимости переменных. Спасибо большое, megaloman! Самое обидное, что эту тонкость с видимостью я знал, но сначала решил, что ошибся где-то в алгоритме или в Enumerator и в горячке пропустил это очевидное решение.

Отправлено: 22:44, 20-02-2011 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Рекурсивный обход папок в WSH на JS

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход