DMBS
27-12-2013, 08:39
Здравствуйте, на широких просторах интернета нашел скрипт ,
основной задачей которого является "Поиск дубликатов файлов по размеру и их побайтное сравнение посредством штатной утилиты "fc"
Скрипт запускается из командной строки : cscript.exe //nologo ads.js c:\Windows\ > users_duplicates.txt
Запустить скрипт с консольным интерфейсом, сам скрипт ads, путь для проверки и txt файл для логгирования дубликатов.
Как в скрипте жестко указать путь,чтобы не запускать его каждый раз из командной строки а подсунуть в планировщик и выполнять его раз в сутки к примеру.
Пытался жестко прописывать путь, в различных вариациях var path = c:\Windows\; и тд в том же духе. , не получается...
Со скриптами не работал,пока с ними на ВЫ. Заранее спасибо за помощь.
var path = WScript.Arguments(0);
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");
var min_file_size = 1024; // минимальный размер файла для проверки
var files = new Array;
WScript.StdOut.WriteLine("Поиск одинаковых файлов в " + path);
scan(path);
WScript.StdOut.WriteLine("Выбрано файлов для сравнения " + files.length);
process();
WScript.Quit(0);
function scan(path) {
var folder = fso.GetFolder(path);
for(var e = new Enumerator(folder.Files); !e.atEnd(); e.moveNext())
if (e.item().Size >= min_file_size)
files.push(e.item());
for(var e = new Enumerator(folder.SubFolders); !e.atEnd(); e.moveNext())
scan(e.item().Path);
}
// сравнивает по возрастанию размера файла
function sort_by_size_asc(a,b) {
if (a.size < b.size)
return (-1);
if (a.size > b.size)
return 1;
return 0;
}
// сравнивает по убыванию размера файла
function sort_by_size_desc(a,b) {
if (a.size > b.size)
return (-1);
if (a.size < b.size)
return 1;
return 0;
}
// обработка списка файлов
function process(){
var total_count = 0, total_bytes = 0;
files.sort(sort_by_size_desc);
while (files.length > 1) {
var count = 0;
var fc = 0;
for (var i = 1; i < files.length && files[0].Size == files[i].Size;) {
fc = shell.Run("fc /b \"" +
files[0].ParentFolder + "\\" + files[0].Name + "\" \"" +
files[i].ParentFolder + "\\" + files[i].Name + "\"",0,true);
if (fc == 0) { // файлы одинаковые
WScript.StdOut.WriteLine(files[i].ParentFolder + "\\" + files[i].Name);
files.splice(i,1);
++count;
}
else
++i;
}
if (count) { // найдены копии файла files[0]
WScript.StdOut.WriteLine(files[0].ParentFolder + "\\" + files[0].Name);
var extra_bytes = files[0].Size * count;
WScript.StdOut.WriteLine("> " + ++count + " одинаковых файлов (" +
files[0].Size + " байт в каждом, " +
extra_bytes + " байт в копиях)");
++total_count;
total_bytes += extra_bytes;
}
files.shift();
}
WScript.StdOut.WriteLine("Всего " + total_bytes + " байт в " +
total_count + " копиях файлов");
}
основной задачей которого является "Поиск дубликатов файлов по размеру и их побайтное сравнение посредством штатной утилиты "fc"
Скрипт запускается из командной строки : cscript.exe //nologo ads.js c:\Windows\ > users_duplicates.txt
Запустить скрипт с консольным интерфейсом, сам скрипт ads, путь для проверки и txt файл для логгирования дубликатов.
Как в скрипте жестко указать путь,чтобы не запускать его каждый раз из командной строки а подсунуть в планировщик и выполнять его раз в сутки к примеру.
Пытался жестко прописывать путь, в различных вариациях var path = c:\Windows\; и тд в том же духе. , не получается...
Со скриптами не работал,пока с ними на ВЫ. Заранее спасибо за помощь.
var path = WScript.Arguments(0);
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");
var min_file_size = 1024; // минимальный размер файла для проверки
var files = new Array;
WScript.StdOut.WriteLine("Поиск одинаковых файлов в " + path);
scan(path);
WScript.StdOut.WriteLine("Выбрано файлов для сравнения " + files.length);
process();
WScript.Quit(0);
function scan(path) {
var folder = fso.GetFolder(path);
for(var e = new Enumerator(folder.Files); !e.atEnd(); e.moveNext())
if (e.item().Size >= min_file_size)
files.push(e.item());
for(var e = new Enumerator(folder.SubFolders); !e.atEnd(); e.moveNext())
scan(e.item().Path);
}
// сравнивает по возрастанию размера файла
function sort_by_size_asc(a,b) {
if (a.size < b.size)
return (-1);
if (a.size > b.size)
return 1;
return 0;
}
// сравнивает по убыванию размера файла
function sort_by_size_desc(a,b) {
if (a.size > b.size)
return (-1);
if (a.size < b.size)
return 1;
return 0;
}
// обработка списка файлов
function process(){
var total_count = 0, total_bytes = 0;
files.sort(sort_by_size_desc);
while (files.length > 1) {
var count = 0;
var fc = 0;
for (var i = 1; i < files.length && files[0].Size == files[i].Size;) {
fc = shell.Run("fc /b \"" +
files[0].ParentFolder + "\\" + files[0].Name + "\" \"" +
files[i].ParentFolder + "\\" + files[i].Name + "\"",0,true);
if (fc == 0) { // файлы одинаковые
WScript.StdOut.WriteLine(files[i].ParentFolder + "\\" + files[i].Name);
files.splice(i,1);
++count;
}
else
++i;
}
if (count) { // найдены копии файла files[0]
WScript.StdOut.WriteLine(files[0].ParentFolder + "\\" + files[0].Name);
var extra_bytes = files[0].Size * count;
WScript.StdOut.WriteLine("> " + ++count + " одинаковых файлов (" +
files[0].Size + " байт в каждом, " +
extra_bytes + " байт в копиях)");
++total_count;
total_bytes += extra_bytes;
}
files.shift();
}
WScript.StdOut.WriteLine("Всего " + total_bytes + " байт в " +
total_count + " копиях файлов");
}