Чтобы получить в Windows список папок/файлов, вложенных в заданную папку, можно использовать следующий скрипт WSH/JScript с использованием рекурсии. Вообще-то, dir /s тоже позволяет получить список файлов во всех подкаталогах, но если имена папок/файлов имена содержат Unicode символы, они могут быть преобразованы в похожие Ansi, например, французская буква é может быть преобразована в обычное e, и тогда имя файла станет некорректным, т.к. при попытке обратиться к нему возникнет ошибка «файл не найден».

Текст скрипта следующий:

function scan_folder(_path)
{
    var folder = fso.GetFolder(_path);
    for (var e = new Enumerator(folder.Files); !e.atEnd(); e.moveNext())
        f.writeline(e.item().Path);
    for (var e = new Enumerator(folder.SubFolders); !e.atEnd(); e.moveNext())
        scan_folder(e.item().Path);
}

var fso = WScript.CreateObject("Scripting.FileSystemObject");
var fn = "scan_tree.txt";
var f = fso.CreateTextFile(fn,true,true);
scan_folder(".");
f.Close();

Скрипт сохраняет список файлов в файл scan_tree.txt, файл создаётся в кодировке Unicode – если пути или имена файлов будут содержать Unicode символы, они сохранятся правильно.

Функция scan_folder() выводит список файлов своего каталога и рекурсивно вызывает себя же для подкаталогов. В итоге, в выходном файле получаем список файлов (путь и имя).

Коллекция folder.Files содержит объекты File Object и представляет список файлов данного каталога, соответствующий цикл выводит для каждого файла значение поля Path

Коллекция folder.SubFolders содержит объекты Folder Object – подпапки.

Помимо вывода всех существующих файлов, можно добавить в цикл условие, например, для вывода только файлов с установленным архивным артибутом сделаем условие на поле Attributes:

function scan_folder(_path)
{
    var folder = fso.GetFolder(_path);
    for (var e = new Enumerator(folder.Files); !e.atEnd(); e.moveNext())
        if ( ( e.item().Attributes & 32 ) && 
            (( e.item().Attributes & 6 ) == 0) )
        f.writeline(e.item().Path);
    for (var e = new Enumerator(folder.SubFolders); !e.atEnd(); e.moveNext())
        scan_folder(e.item().Path);
}

var fso = WScript.CreateObject("Scripting.FileSystemObject");
var fn = "scan_tree.txt";
var f = fso.CreateTextFile(fn,true,true);
scan_folder(".");
f.Close();

Теперь скрипт выведен файлы с установленным архивным атрибутом, кроме скрытых и системных.

Обход дерева каталогов в JScript
Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *