将目录内容打印到 MS Word 表格中需要很长时间

问题描述

我正在编写一个 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+"\":\r\n";
        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);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)