问题描述
我正在编写一个 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 (将#修改为@)