1

Тема: JScript: поиск файлов по расширению

Поиск файлов средствами CMD.

Функция получения списка файлов средствами cmd.exe. От аналогов она отличается скоростью работы при поиске в «большом» количестве файлов.

Directory — обязательный параметр, каталог поиска
Extension — необязательный параметр, расширения разыскиваемых файлов через пробел. По умолчанию "".
Deep — необязательный параметр, флаг учета дочерних директорий

Возвращает список файлов в виде массива.

Функция использует сторонний компонент Steam.Reader от участника форума Xameleon.
Stream.Reader весит 5 кб в архиве. Взять его можно тут.

function GetFileList(Directory, Extension, Deep)
{
    var
        FSO = WScript.CreateObject("Scripting.FileSystemObject"),
        WshShell = WScript.CreateObject("WScript.Shell"),
        LastCurrentDirectory = WshShell.CurrentDirectory;

// Проверка необязательных параметров Extension, Deep
        !Extension || Extension=="" ? Extension = "": null;
        Deep? Deep = "/S": Deep = "";
        
// Преобразуем исходнный Directory в короткий путь
        Directory = FSO.GetFolder(Directory).ShortPath;
        
    var    
        Result = [],
        Command, 
        TempPath = WshShell.ExpandEnvironmentStrings("%TEMP%")+"\\", // Путь к папке %TEMP%
        TempBuffer = TempPath + (new Date()).valueOf().toString().substring(6)+".txt";
        
        // Ведем поиск средствами CMD. 
        Command = "cmd.exe /c chcp 1251 && cmd.exe /c && dir /B "+Deep+" /A:-D "+ Extension+ " > "+TempBuffer;

        // Устанавливаем директорию по умолчанию
        WshShell.CurrentDirectory = Directory;

        // Запустим CMD, ждем окончание выполнения этого процесса
        WshShell.Run(Command, 0, true);
        
    var 
        Stream = WScript.CreateObject("Stream.Reader"),
        blocksize = 64 * 1024, 
        blocks;

        Stream.OpenFile(TempBuffer);
        Stream.position = 0;
        blocks = Stream.size / blocksize;
        
        for (var i=0; i<blocks; i++)
        Result.push(Stream.ReadText(blocksize));
        
        Stream.CloseFile();
        FSO.DeleteFile (TempBuffer);
        
        Result = Result.join("").split("\n");
        Result.length -= 1;
        
        WshShell.CurrentDirectory = LastCurrentDirectory;

    return Result;
}

var
    Directory = "C:\\",
    FileList = [b]GetFileList[/b](Directory, "*.doc *.avi", true);

// Вывод количества найденных файлов doc[x] и avi
WScript.Echo(["Найдено:", FileList.length, "файлов"].join(" "));

2

Re: JScript: поиск файлов по расширению

Поиск файлов средствами CMD без использования сторонних компонентов

Функция GetFileList.

Directory — обязательный параметр, каталог поиска
Extension — необязательный параметр, расширения разыскиваемых файлов через пробел. По умолчанию "".
Deep — необязательный параметр, флаг учета дочерних директорий

Возвращает список файлов в виде массива.

function GetFileList(Directory, Extension, Deep)
{
    var
        FSO = WScript.CreateObject("Scripting.FileSystemObject"),
        WshShell = WScript.CreateObject("WScript.Shell"),
        LastCurrentDirectory = WshShell.CurrentDirectory;

// Проверка необязательных параметров Extension, Deep
        !Extension || Extension=="" ? Extension = "": null;
        Deep? Deep = "/S": Deep = "";
        
// Преобразуем исходнный Directory в короткий путь
        Directory = FSO.GetFolder(Directory).ShortPath;
        
    var    
        Result = [],
        Command, 
        TempPath = WshShell.ExpandEnvironmentStrings("%TEMP%")+"\\", // Путь к папке %TEMP%
        TempBuffer = TempPath + (new Date()).valueOf().toString().substring(6)+".txt";
        
        // Ведем поиск средствами CMD. 
        Command = "cmd.exe /c chcp 1251 && cmd.exe /c && dir /B "+Deep+" /A:-D "+ Extension+ " > "+TempBuffer;

        // Устанавливаем директорию по умолчанию
        WshShell.CurrentDirectory = Directory;

        // Запустим CMD, ждем окончание выполнения этого процесса
        WshShell.Run(Command, 0, true);

    var 
        Stream = FSO.OpenTextFile(TempBuffer, 1, false);
        Result = Stream.ReadAll();
        Stream.Close();
        
        FSO.DeleteFile (TempBuffer);
        
        Result = Result.split("\n");
        Result.length -= 1;
        
        WshShell.CurrentDirectory = LastCurrentDirectory;

    return Result;
}

3

Re: JScript: поиск файлов по расширению

Использование FileSearch из MsWord|Excel|Access  нерационально, так как, начиная с 2007 версии офиса, данная возможность не поддерживается.

Поэтому указанный ниже код (который, к сожалению, я не могу проверить) будет работать в старых версиях.

function GetFileList(Directory, Extension, Deep)
{
    !Extension || Extension=="" ? Extension = "*.*": null;
    Deep? Deep = true: Deep = false;

    var Application = new ActiveXObject("Excel.Application"),
    FileSearch = Application.FileSearch;

    Application.NewSearch();
    FileSearch.FileName = Extension;
    FileSearch.LookIn = Directory;
    FileSearch.SearchSubfolders = Deep;
    FileSearch.Execute();
    
    var Result = [];
    
    for (var i=0, l=FileSearch.FoundFiles.Count; i<l; i++)
    Result.push(FileSearch.FoundFiles[i]);
    
    FileSearch = null;
    Application.Quit();
    return Result;
}

Microsoft предлагает использовать FSO или команду Dir из VBA.