Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Указание пути в скрипте на JS. (http://forum.oszone.net/showthread.php?t=274788)

DMBS 27-12-2013 08:39 2279230

Указание пути в скрипте на JS.
 
Здравствуйте, на широких просторах интернета нашел скрипт ,
основной задачей которого является "Поиск дубликатов файлов по размеру и их побайтное сравнение посредством штатной утилиты "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 + " копиях файлов");
}


Iska 27-12-2013 09:06 2279234

DMBS, для поиска дубликатов воспользуйтесь лучше утилитой CloneSpy.
Цитата:

Цитата DMBS
Как в скрипте жестко указать путь,чтобы не запускать его каждый раз из командной строки »

1. Не надо «жёстко указывать путь» в скрипте.
2. Вы никак не избавитесь от командной строки, пока будете продолжать делать перенаправление вывода результатов во внешний файл.

Цитата:

Цитата DMBS
а подсунуть в планировщик »

Подсовывайте. Что мешает?

Цитата:

Цитата DMBS
Пытался жестко прописывать путь, в различных вариациях var path = c:\Windows\; »

«c:\\Windows»:
Код:

var objFSO = WScript.CreateObject("Scripting.FileSystemObject");
var objFolder = objFSO.GetFolder("c:\\Windows");

WScript.Echo(objFolder.Path);


DMBS 27-12-2013 09:29 2279243

Спасибо за ответ, Программ, конечно же много не спорю и стандартный TotalCommanderдаже может помочь в этой ситуации,
находил и много исходных кодов с codeguru , которые можно было редактировать под свои задачи.
Нужен именно скрипт на VB или JS.

Iska 27-12-2013 09:37 2279248

DMBS, сравнивать по «fc.exe» при наличии дубликатов накладно. Лучше считать хэш MD5 и сравнивать по нему.

DMBS 27-12-2013 09:44 2279249

Согласен, сканирование папки Windows данным скриптом занимает порядка 3-4 часов))FC очень долго проводит сравнение больших файлов. В сторону md5 смотрел,когда хотел программу написать на с# , куда копать в JS в данном направлении честно понятия не имею!

Iska 27-12-2013 11:05 2279266

Копать нужно в сторону бесплатных компонентов, например, Microsoft CAPICOM 2.1.0.2: Download Security Update for CAPICOM (KB931906) from Official Microsoft Download Center (не уверен в наличии, возможности установки и работоспособности под Windows 7 и выше) или XStandard MD5 Component. Либо использовать PowerShell, где вычисление MD5 доступно посредством .Net.


Время: 22:15.

Время: 22:15.
© OSzone.net 2001-