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

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

korenza 08-06-2010 09:55 1429820

Побайтовое сравнение двух файлов
 
Всем добрый день. Задачка такова, необходимо побайтово сравнить два файла. Реализовать необходимо либо в VBS-е, либо в JS. Т.к. я новичок в этом деле, может кто сможет помочь с кодом, буду очень признателен.

amel27 10-06-2010 09:26 1431293

korenza, что нужно получить в результате?... список различий или только True/False?

korenza 10-06-2010 11:49 1431399

amel27, Добрый день, пока ждал подсказки, наваял на JS, вот такого плана
Код:

CompareFiles() 
function CompareFiles()
{                         
var Stream = new ActiveXObject("ADODB.Stream"),
FSO = WScript.CreateObject("Scripting.FileSystemObject"),                       
Args = WScript.Arguments;                       
if (Args.Length == 0)                               
WScript.echo("Запущен скрипт без указания аргументов командной строки");                       
else if(Args.Length != 2)                               
WScript.echo("Количество аргументов командной строки должно быть равно 2");                       
else               
var fso = new ActiveXObject("Scripting.FileSystemObject"),                       
filesPath = Args.Item(0),                       
filesPath1 = Args.Item(1);                       
if(!fso.FileExists(filesPath))               
{                       
WScript.echo("Файла для сравнения'" +Args.Item(0)+ "'  нет на диске")                       
return;                }                       
else if(!fso.FileExists(filesPath1))                                 
{                       
WScript.echo("Файла для сравнения '" +Args.Item(1)+ "'  нет на диске")                       
return;               
}                       
{                       
WScript.echo("Начинаю проверку файлов на идентичность");                               
Stream.Type = 2;               
Stream.Open();                               
Stream.LoadFromFile(FSO.GetAbsolutePathName(Args(0)));               
var File1 = Stream.ReadText();                               
Stream.Close();                       
Stream.Open();                       
Stream.LoadFromFile(FSO.GetAbsolutePathName(Args(1)));               
var File2 = Stream.ReadText();                       
Stream.Close();       
if (File1 == File2) WScript.echo("Файлы идентичны");               
else WScript.echo("Файлы неидентичны");                                       
} }

Теперь возник один маленький вопрос.
Сейчас, если в качестве первого аргумента введен несуществующий файл, то в консоли выдается сообщение, что файла +Args.Item(0)+ нет на диске, если же введен в качестве второго аргумента несуществующий файл, то выдается сообщение, что файла +Args.Item(0)+ нет. Как бы сделать так, чтобы выводилось сообщение об отсутствии либо 2-х файлов сразу (если их действительно нет), либо первого, либо второго, в зависимости от заданных аргументов коммандной строки.

amel27 10-06-2010 12:17 1431427

korenza, на JS с VBS перестраиваться не буду, для проверки существования используйте метод FileExists объекта "Scripting.FileSystemObject" и свойство Args.Count для перебора параметров

korenza 10-06-2010 12:22 1431433

amel27, Ок, без проблем, но если незатруднительно, можете скинуть код бинарного сравнения файлов на VBS, результат True/False, без лишних проверок?

amel27 10-06-2010 14:05 1431507

korenza, примерно так:
Код:

Set oFSO = CreateObject("Scripting.FileSystemObject")

WScript.Echo FileCompare("C:\test1","C:\test2")

Function FileCompare(sFile1, sFile2)
  Dim oStream, buf1, buf2

  FileCompare = vbFalse
  If oFSO.FileExists(sFile1) And oFSO.FileExists(sFile2) Then
    Set oStream=WScript.CreateObject("ADODB.Stream")
    oStream.Open:oStream.Type=1
    oStream.LoadFromFile(sFile1):buf1 = oStream.Read
    oStream.LoadFromFile(sFile2):buf2 = oStream.Read
    oStream.Close

    If UBound(buf1)=UBound(buf2) Then
      buf1=CStr(buf1):buf2=CStr(buf2)
      If StrComp(buf1,buf2,0)=0 Then FileCompare=vbTrue:Exit Function
    End If
  End If
End Function


korenza 10-06-2010 14:42 1431536

amel27, Спасибо за код. Просто хочу научиться скриптить и на VBS. Только при сравнении файлов всегда возвращается -1, даже если они идентичны.?

amel27 10-06-2010 16:15 1431588

korenza, -1 это как раз совпадение, т.е. "истина" (vbTrue), 0 - "ложь" (vbFalse)

korenza 10-06-2010 16:25 1431594

Когда файлы различны, тоже выдает -1

amel27 11-06-2010 06:43 1431931

korenza, гм... странно, у меня вроде правильно выдает... по сути это вариация на тему вашего же поста #3
попробуйте другим способом:

Код:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oF1 = FSO.GetFile("test1")
Set oF2 = FSO.GetFile("test2")

WScript.Echo FileCompare(oF1, oF2)

Function FileCompare(oF1, oF2)
  Dim oS:FileCompare = vbTrue

  If oF1.Size <> oF2.Size Then
    FileCompare = vbFalse
    Exit Function
  End If

  Set oS = oF2.OpenAsTextStream(1,0)
  With oF1.OpenAsTextStream(1,0)
    While Not .AtEndOfStream
      If .Read(1)<>oS.Read(1) Then
        FileCompare = vbFalse
        Exit Function
      End If
    Wend
  End With
End Function


amel27 11-06-2010 07:25 1431946

кстати, так тоже вроде работает:

Код:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oF1 = FSO.GetFile("test1")
Set oF2 = FSO.GetFile("test2")

WScript.Echo FileCompare(oF1, oF2)

Function FileCompare(oF1, oF2)
  Dim oS, iZ1, iZ2, sF1, sF2
  iZ1=oF1.Size:iZ2=oF2.Size
  FileCompare=False

  If iZ1<>iZ2 Then Exit Function
  Set oS=oF1.OpenAsTextStream(1,0)
  sF1 = oS.Read(iZ1)
  Set oS=oF2.OpenAsTextStream(1,0)
  sF2 = oS.Read(iZ2)

  If StrComp(sF1,sF2,0)=0 Then FileCompare=True
End Function


korenza 11-06-2010 09:21 1431978

Теперь, только "0" выдает, в любом случае, если одинаковые и если разные.!?

Загадочный скрипт, теперь Ваш первый выдает всегда "0", если файлы одинаковые и если разные.?

amel27 14-06-2010 05:41 1433667

Цитата:

Цитата korenza
только "0" выдает, в любом случае »

это уже подозрительно, даже в таком варианте?..
Код:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oF1 = FSO.GetFile(Wscript.ScriptFullName)
Set oF2 = FSO.GetFile(Wscript.ScriptFullName)

WScript.Echo FileCompare(oF1, oF2)

Цитата:

Цитата korenza
Загадочный скрипт »

ничего загадочного - обычное чтение в переменную с последующим сравнением

qwerty_332 14-07-2018 19:39 2821788

Немного модифицировал ваш скрипт для своих нужд. А именно если файлы разные то выполняется действие по запуску батника и записи в лог. Если файлы одинаковые то ничего не запускается. Я пока нуб в vbs, только пытаюсь организовать автоматизацию в своей работе. Поэтому пришлось немного посидеть поразбираться в функциях и синтаксисе.
Вообщем вот мой переделанный вариант:

Код:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oF1 = FSO.GetFile("C:\Users\admin\Desktop\VBS\program_new.exe")
Set oF2 = FSO.GetFile("C:\Users\admin\Desktop\VBS\program_old.exe")


WScript.Echo FileCompare(oF1, oF2)

Function FileCompare(oF1, oF2)
  Dim oS, iZ1, iZ2, sF1, sF2
  iZ1=oF1.Size:iZ2=oF2.Size
  FileCompare=True

  If iZ1<>iZ2 Then 'Exit Function
  Set oS=oF1.OpenAsTextStream(1,0)
  sF1 = oS.Read(iZ1)
  Set oS=oF2.OpenAsTextStream(1,0)
  sF2 = oS.Read(iZ2)

  'If StrComp(sF1,sF2,0)=0 Then FileCompare=False
          Set shell=createobject("wscript.shell")
        shell.run "C:\Users\admin\Desktop\VBS\Run.bat"
        Set shell=Nothing
        Set objFS = CreateObject("Scripting.FileSystemObject")
        Set objFile = objFS.OpenTextFile("C:\Users\admin\Desktop\VBS\script_log.log", 8, True)
        objFile.WriteLine "Install promt time: " & date & " " & time
        objFile.Close
        Set objFile = Nothing
        Set objFS = Nothing
  End If
 End Function

Замутил себе скрипт по загрузке инстала программы и его последующего сравнения. Если загруженная версия отличается от той которая уже есть то стартует батник по обновлению ПО на компах в сети.
Этот пример очень помог в реализации "мега-проекта" :)

Нужно убрать в строке If iZ1<>iZ2 Then Exit Function непосредственно выход из функции "Exit Function", таким образом проверка идет дальше.
Также можно убрать строку If StrComp(sF1,sF2,0)=0 Then FileCompare=False чтобы не перезаписывалась переменная FileCompare. Я пока не понял зачем она нужна.

Serguei Kouzmine 15-07-2018 17:18 2821864

можеты быть просто вызывать

Код:

c:\Windows\System32\fc.exe /?
Compares two files or sets of files and displays the differences between
them


FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/u] [/W] [/nnnn]
  [drive1:][path1]filename1 [drive2:][path2]filename2
FC /B [drive1:][path1]filename1 [drive2:][path2]filename2

  /A        Displays only first and last lines for each set of differences.
  /B        Performs a binary comparison.
  /C        Disregards the case of letters.
  /L        Compares files as ASCII text.
  /LBn      Sets the maximum consecutive mismatches to the specified
            number of lines.
  /N        Displays the line numbers on an ASCII comparison.
  /OFF[LINE] Do not skip files with offline attribute set.
  /T        Does not expand tabs to spaces.
  /U        Compare files as UNICODE text files.
  /W        Compresses white space (tabs and spaces) for comparison.
  /nnnn      Specifies the number of consecutive lines that must match
            after a mismatch.
  [drive1:][path1]filename1
            Specifies the first file or set of files to compare.
  [drive2:][path2]filename2
            Specifies the second file or set of files to compare.



Время: 01:51.

Время: 01:51.
© OSzone.net 2001-