|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Побайтовое сравнение двух файлов |
|
|
VBS/WSH/JS - Побайтовое сравнение двух файлов
|
Новый участник Сообщения: 25 |
Всем добрый день. Задачка такова, необходимо побайтово сравнить два файла. Реализовать необходимо либо в VBS-е, либо в JS. Т.к. я новичок в этом деле, может кто сможет помочь с кодом, буду очень признателен.
|
|
Отправлено: 09:55, 08-06-2010 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать korenza, что нужно получить в результате?... список различий или только True/False?
|
Отправлено: 09:26, 10-06-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 25
|
Профиль | Отправить PM | Цитировать 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-х файлов сразу (если их действительно нет), либо первого, либо второго, в зависимости от заданных аргументов коммандной строки. |
Отправлено: 11:49, 10-06-2010 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать korenza, на JS с VBS перестраиваться не буду, для проверки существования используйте метод FileExists объекта "Scripting.FileSystemObject" и свойство Args.Count для перебора параметров
|
Отправлено: 12:17, 10-06-2010 | #4 |
Новый участник Сообщения: 25
|
Профиль | Отправить PM | Цитировать amel27, Ок, без проблем, но если незатруднительно, можете скинуть код бинарного сравнения файлов на VBS, результат True/False, без лишних проверок?
|
|
Отправлено: 12:22, 10-06-2010 | #5 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать 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 |
Отправлено: 14:05, 10-06-2010 | #6 |
Новый участник Сообщения: 25
|
Профиль | Отправить PM | Цитировать amel27, Спасибо за код. Просто хочу научиться скриптить и на VBS. Только при сравнении файлов всегда возвращается -1, даже если они идентичны.?
|
Отправлено: 14:42, 10-06-2010 | #7 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать korenza, -1 это как раз совпадение, т.е. "истина" (vbTrue), 0 - "ложь" (vbFalse)
|
Отправлено: 16:15, 10-06-2010 | #8 |
Новый участник Сообщения: 25
|
Профиль | Отправить PM | Цитировать Когда файлы различны, тоже выдает -1
|
Отправлено: 16:25, 10-06-2010 | #9 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать 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 |
Отправлено: 06:43, 11-06-2010 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Сравнение двух файлов>ветвление "fc" или "diff" | dARKest | Скриптовые языки администрирования Windows | 4 | 06-07-2009 23:02 | |
Сравнение производительности двух ОС | Dabaduch | Хочу все знать | 3 | 13-06-2009 19:27 | |
Сравнение двух процов | Rozmen | Хочу все знать | 4 | 03-08-2008 12:35 | |
сравнение двух ноутбучных видеокарт X1700 и x2500 | Sparkster | Видеокарты | 1 | 14-03-2008 13:07 | |
сравнение двух массивов строк в Си | bool | Программирование и базы данных | 5 | 04-05-2005 17:04 |
|