Печать содержимого каталога в таблицу MS Word занимает много времени

#automation #ms-word #jscript

Вопрос:

Я пишу сценарий JS, который печатает отсортированный список файлов в указанном каталоге в таблицу MS Word. Он отлично работает для большинства каталогов, но моя папка system32 содержит около 3000 файлов, и для завершения моего сценария требуется несколько минут. Я думаю, что это уже слишком. Есть ли что-то, что я должен оптимизировать в своем коде?

 var X,D,FSO,sortedFiles=[],knownExtensions=[],scriptArgs,unnamedArgs;
var registryReader=new ActiveXObject("WScript.Shell");
scriptArgs = WScript.Arguments;
unnamedArgs=scriptArgs.Unnamed; 
if(unnamedArgs.length!=2) WScript.Echo("Invalid arguments");
else {
    FSO = new ActiveXObject("Scripting.FileSystemObject");
    X=unnamedArgs(0); // path
    D=unnamedArgs(1); // document name
    if(!FSO.FolderExists(X)) {
        FSO.CreateFolder(X);
        WScript.Echo("Каталог не существует, создадим его");
    }
    if(FSO.FileExists(X "\" D)) {
        WScript.Echo("Ошибка: документ уже существует");
    }
    else {
        getSortedFilesList();
        fillDocument();
    }
    
}

function fillDocument()
{
    var textEditor,textDocument,table,currentFileSize=0,totalSize=0,p;
    textEditor=new ActiveXObject("Word.Application");
    textEditor.ScreenUpdating = false;
    try{
        textDocument = textEditor.Documents.Add();
        textDocument.Paragraphs.Add();
        p=textDocument.Content;
        p.Text = "Файлы каталога "" X "":rn";
        p.Paragraphs.Alignment = 1; //по центру
        p.Collapse(0);      
        table=textDocument.Tables.Add(p, sortedFiles.length 1, 4);
        table.Range.ParagraphFormat.Alignment=0; // по левому краю
        table.Borders.Enable = true;
        table.Cell(1,1).Range = "№";
        table.Cell(1,2).Range = "Название";
        table.Cell(1,3).Range = "Тип";
        table.Cell(1,4).Range = "Размер";
        for(var i=0; i<sortedFiles.length; i  )
        {
            table.Cell(i 2,1).Range = i 1;
            table.Cell(i 2,2).Range = sortedFiles[i].Name;
            table.Cell(i 2,3).Range = getExtensionInfo(getFileExtension(sortedFiles[i].Name));
            table.Cell(i 2,4).Range = sortedFiles[i].Size;
        }
        for(var i=2; i<=table.Rows.Count; i  )
        {
            currentFileSize=parseInt(table.Cell(i,4).Range);
            totalSize =currentFileSize;
        }
        table.Rows.Add();
        table.Cell(table.Rows.Count,1).Merge(table.Cell(table.Rows.Count,3));
        table.Cell(table.Rows.Count,1).Range="Всего";
        table.Cell(table.Rows.Count,1).Range.ParagraphFormat.Alignment = 2; // по правому краю
        table.Cell(table.Rows.Count,2).Range=totalSize;
        table.Rows(1).HeadingFormat = true; // отображаем шапку на каждой странице документа
        p.Collapse(0);
        textDocument.SaveAs(X "\" D);
    }
    catch(e){ WScript.Echo("При работе с документом произошла ошибка: " e.description); }
    textEditor.ScreenUpdating = true;
    textEditor.Quit();
}

function getSortedFilesList()
{
    var currentFolder,myEnum;
    currentFolder=FSO.GetFolder(X);
    myEnum=new Enumerator(currentFolder.Files);
    while(!myEnum.atEnd()) {
        sortedFiles.push(myEnum.item());
        myEnum.moveNext();
    }
    sortedFiles.sort(mySort);
    return sortedFiles;
}

function mySort(a,b){
    if(a.Name.toLowerCase()==b.Name.toLowerCase()) return 0;
    if(a.Name.toLowerCase()<b.Name.toLowerCase()) return -1;
    else return 1;
}

function getExtensionInfo(ext){
    try {
        if(!(ext in knownExtensions)) {
            var defaultKey=registryReader.RegRead("HKCR\" ext "\");
            if(defaultKey=="") throw "empty_value";
            var extensionInfo=registryReader.RegRead("HKCR\" defaultKey "\");
            knownExtensions[ext]=extensionInfo " (" ext ")";
        }
    }
    catch(e)
    {
        WScript.Echo("Предупреждение: не удалось получить информацию о расширении:  " ext);
        knownExtensions[ext]="Неизвестно (" ext ")";
    }
    return knownExtensions[ext];
}

function getFileExtension(filename) {
    var index=filename.lastIndexOf(".");
    return filename.substr(index);
}