#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);
}