Чтобы получить в 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();
Теперь скрипт выведен файлы с установленным архивным атрибутом, кроме скрытых и системных.