Люди, использующие системы контроля версий исходного кода (SVN, Mercurial, Git и т.п.), наверняка часто пользуются возможностью сравнения версий файлов для просмотра внесенных пользователями изменений. Существует множество независимых программ сравнения версий (WinMerge, BeyondCompare и др.). При сравнении версий, как правило, две версии файла показываются рядом друг с другом таким образом, чтобы одинаковые (неизменившиеся) части документов были расположены напротив друг друга, а изменившиеся (добавленные и удаленные) выделяются соответствующим цветом.
Уверен, многим было бы интересно узнать, какие алгоритмы могут использоваться для реализации такого сравнения.
В качестве простейшего случая рассмотрим сравнение простых текстовых (plain text) файлов.
Текстовый файл — это набор строк (а точнее абзацев) текста. Абзац — это строка символов, заканчивающая символами конца строки и перевода каретки (в Windows) или только одним символом конца строки (в Unix/Linux). Не будем отвлекаться на то, что символы могут быть представлены различными кодировками и будем считать, что мы имеем дело с однобайтной ASCII. Задача сравнения версий такого файла заключается в определении того, какие абзацы не изменились, а какие изменились, были удалены или добавлены.
Сравнение лучших программ для анимации. Toon Boom Harmony против Adobe Animate.
Большинство алгоритмов сравнения файлов основаны на алгоритме поиска самой длинной совпадающей подпоследовательности (LCS, Longest Common Subsequence). Действительно, самая длинная общая подпоследовательность символов двух файлов можно считать неизменившейся частью, а все остальные участки (в зависимости от их принадлежности к одной из версий) являются удаленными (если они принадлежат старой версии) или добавленными (если принадлежат новой).
Существует несколько реализаций алгоритма LCS, вычислительная сложность которых варьируется от полиномиальной (прямо пропорциональной длинам сравниваемых подпоследовательностей) до логарифмической. Данные алгоритмы также очень требовательны к памяти. Становится понятно, что использовать посимвольное представление документов в таких условиях нереально. Удобнее в качестве единиц сравнения использовать абзацы. Их можно сравнивать «как есть», т.е. непосредственно как строки, но в целях оптимизации удобнее их прохэшировать и сравнивать хэши, а к самим строкам обращаться только в случае совпадения хэшей (т.к. от коллизий при хэшировании никто не застрахован).
Таким образом, первый этап алгоритма сравнения заключается в загрузке списка абзацев документов в память (да, нам действительно придется загрузить оба сравниваемых документа целиком в память), их хэшировании и применении к полученным хэшам алгоритма поиска наибольшей общей совпадающей подпоследовательности (LCS). На выходе данного этапа мы получим информацию о гарантированно неизменившихся (т.е. совпадающих) участках документов. Все остальные участки являются изменившимися. Если изменившемуся участку из старой версии соответствует пустой участок в новой версии, значит этот участок был удален. Если изменившемуся участку новой версии соответствует пустой участок в старой версии, значит этот участок был добавлен.
Сделай так, если надо БЫСТРО найти отличия в таблицах! 4 способа быстро СРАВНИТЬ 2 списка в Excel
Сложнее дело обстоит с измененными участками, присутствующими и в старой, и в новой версии. Например, между двумя совпадающими участками может располагаться изменившийся участок, который в старой версии составлял два абзаца, а в новой — три. Равных (совпадающих) абзацев среди этих пяти абзацев нет.
Если остановиться на этом шаге, можно просто при показе пользователю выделить эти группы абзацев целиком как измененные и переложить задачу анализа подробных изменений на пользователя. Но можно поступить хитрее. Можно рассчитать оптимальное соответствие для абзацев измененного участка, чтобы точно знать, какой которому соответствует.
Для оценки «похожести» каждой пары абзацев можно применить алгоритм расчета так называемой «дистанции редактирования» (или расстояния Левенштейна). Дистанция редактирования — это минимальное количество операций вставки, удаления и замены одного символа на другой, необходимых для превращения одной строки в другую.
Вычислив дистанцию редактирования между каждой парой абзацев измененного участка, мы можем применить метод динамического программирования для вычисления оптимального соответствия между абзацами измененного участка. Самым неоптимальным вариантом размещения при этом является тот, когда все абзацы измененного участка в старой версии считаются удаленными, а все абзацы новой версии — добавленными (т.е. никто никому не соответствует). Все остальные варианты размещения будут более оптимальны. Применив метод динамического программирования (как именно его можно в данном случае применить, напишу в другом посте) можно найти самый оптимальный вариант соответствия. Теперь мы уже точно знаем, какой абзац измененного участка какому соответствует и сможем применить алгоритм сравнения (на этот раз уже посимвольный) для вычисления точных изменений внутри абзаца.
Если уважаемым читателям интересны подробности и особенности реализации алгоритмов поиска наибольшей общей подпоследовательности, дистанции редактирования и применения метода динамического программирования для вычисления оптимального соответствия группы изменившихся абзацев (последний алгоритм я считаю своего рода моим ноу-хау), просьба писать об этом в комментариях, и я напишу об этом более подробные посты (каждый из этих алгоритмов сам по себе очень интересен и заслуживает отдельного поста).
- алгоритм
- алгоритмы
- сравнение
- сравнение файлов
- хэширование
- оптимизация
- контроль версий
- сравнение версий
- дистанция редактирования
- расстояние Левенштейна
- LCS
- Longest Common Subsequence
- Разработка веб-сайтов
- Программирование
- Алгоритмы
Источник: habr.com
Как сравнить версии двух исполняемых файлов из командной строки?
оба «тот же файл», но новая версия от поставщика, чем другие. Когда я открываю свойства для одного из них, я получаю следующее На вкладке подробности:
в пакетном режиме я хотел бы сравнить две версии файлов и сделать что-то, если версии разные («если это, то этот» тип сценария).
Я искал повсюду, но я не удается найти метод просмотра атрибута «версия файла» в пакетном режиме. Есть ли какие-то способы сделать это?
обратите внимание, что это не предназначено, чтобы быть «написать сценарий для меня» вопрос. Цель состоит в том, чтобы получить более общий обзор или описание ответа, и в этот момент детали должны быть в состоянии прийти гораздо легче.
задан Panzercrisis
23.03.2023 11:51 3545
3 ответа
Sigcheck -Sysinternals Suite
sigcheck -a -q %windir%system32mstsc.exe
— если нужно добавить его MD5, SHA1 и PESHA1, то SHA256
sigcheck -a -q -h %windir%system32mstsc.exe
— тестовая версия, и выполнить команду:
sigcheck -a -q %windir%system32mstsc.exe | find «Prod version:» | find «6.0.6001.18564» Echo «RDP 6.0.6001.18564»
filever — инструменты поддержки:
filever /V %windir%system32mstsc.exe
filever /V %windir%system32mstsc.exe | findstr «FileDesc Version»
filever /V %windir%system32mstsc.exe | findstr «ProductVersion» | find «6.0.6001.18564» Echo «RDP 6.0.6001.18564»
filever /V %windir%system32mstsc.exe | findstr «ProductVersion» | find «6.0.6001.18564» || Echo «NOT 6.0.6001.18564»
wmic:
wmic datafile where «name=’C:\system32mstsc.exe'» get version
Powershell:
powershell (gi %windir%system32mstsc.exe).versioninfo.FileDescription
powershell (gi %windir%system32mstsc.exe).versioninfo ^|Ft -Au
сравнение версий скриптов:
$VerArr = [version]»8.2.6001.18564″, [version]»6.0.6001.18564″ [version]$v1=»8.2.6001.18564″ [version]$v2=»6.0.6001.18564″ [version]$v3=(gi $env:windirsystem32mstsc.exe).versioninfo.ProductVersion $v3 $v3 -ge $v1 $v3 -ge $v2 If ($VerArr -contains $v3)
Major Minor Build Revision —— —— —— ——— 6 0 6001 18564 False True Run version list block
cscript //Nologo vers01.vbs
WScript.Echo CreateObject(«Scripting.FileSystemObject»).GetFileVersion(CreateObject(«WScript.Shell»).Environment(«Process»)(«WINDIR») system32mstsc.exe»)
JScript:
cscript //Nologo vers01.js
WScript.Echo(new ActiveXObject(«Scripting.FileSystemObject»).GetFileVersion(new ActiveXObject(«WScript.Shell»).ExpandEnvironmentStrings(«%windir%»)+»//system32//mstsc.exe»));
python,pefile:
pefile modyle установка: распаковать, запустить python setup.py install
import pefile, os pe = pefile.PE(os.path.join(os.environ[‘WINDIR’],’system32mstsc.exe’)) ProductVersion = pe.FileInfo[0].StringTable[0].entries[‘ProductVersion’] print ProductVersion
php vers01.php
extension_dir = C:phpext [COM_DOT_NET] extension=php_com_dotnet.dll
GetFileVersion($path); ?>
Perl:
установить С Win32::файл::модуль VersionInfo: cpan Win32::File::VersionInfo
use Win32::File::VersionInfo; $fn=$ENV . «system32mstsc.exe»; $fl=GetFileVersionInfo($fn); if($fl),»n»;>
отвечен STTR 2023-03-24 19:39
если вы будете делать это с обычной IF %ver1% GTR %ver% вы получаете сравнение строк и 6.3.9600 появится больше, чем 10.0.10049 .
Я знаю, вы сказали, что это не «писать для меня», но это тот случай, когда легче написать код, чем объяснить на простом английском языке (и код не требует пояснений).
С https://superuser.com/a/363308/131936 я нашел как читать версия файла, используя wmic , которое погружено с обнаженными окнами.
compareVersion.cmd
( SETLOCAL ECHO Usage: %0 [] ECHO If second argument provided, returns error level 1 if version of file is less than required ECHO Otherwise, sets %%filever%% variable to file version No. rem https://superuser.com/a/363308/131936 SET «fileNameForWMIC=%~1» ) SET fileNameForWMIC=%fileNameForWMIC:=% FOR /F «usebackq skip=1″ %%I IN (`wmic datafile where Name^=»%fileNameForWMIC%» get Version`) DO ( SET filever=%%~I GOTO :break ) :break ( IF «%~2″==»» ( ENDLOCAL SET «filever=%filever%» EXIT /B ) FOR /F «delims=. tokens=1,2,3,4» %%I IN («%filever%») DO ( SET fileverSub1=%%I SET fileverSub2=%%J SET fileverSub3=%%K SET fileverSub4=%%L ) FOR /F «delims=. tokens=1,2,3,4» %%I IN («%~2») DO ( SET chkSub1=%%I SET chkSub2=%%J SET chkSub3=%%K SET chkSub4=%%L ) IF NOT DEFINED fileverSub2 SET fileverSub2=0 IF NOT DEFINED fileverSub3 SET fileverSub3=0 IF NOT DEFINED fileverSub4 SET fileverSub4=0 IF NOT DEFINED chkSub2 SET chkSub2=0 IF NOT DEFINED chkSub3 SET chkSub3=0 IF NOT DEFINED chkSub4 SET chkSub4=0 ) ( ENDLOCAL IF %chkSub1% GTR %fileverSub1% EXIT /B 1 IF %chkSub2% GTR %fileverSub2% EXIT /B 1 IF %chkSub3% GTR %fileverSub3% EXIT /B 1 IF %chkSub4% GTR %fileverSub4% EXIT /B 1 EXIT /B 0 )
как использовать это о вас ваш вопрос:
сначала прочитайте одну версию файла:
CALL compareVersion.cmd file1.exe SET file1ver=%filever%
затем сравните его с другими файлами:
CALL compareVersion.cmd file2.exe %file1ver% IF ERRORLEVEL 1 ( … do this when file2 is lower version than file1… ) ELSE ( … do this when file2 is higher or equal to version of file1… )
кроме того, вы можете записать версию, если вы хочу:
CALL compareVersion.cmd file2.exe 1.2.3.4 || (ECHO Min required version 1.2.3.4 not provided https://kompsekret.ru/q/how-can-i-compare-the-versions-of-two-executables-from-the-command-line-10359/» target=»_blank»]kompsekret.ru[/mask_link]
Сравнить версии приложения
Хочу сравнить версию приложения и выявить старая версия или новая версия. Но не знаю как это сделать 🙁 Код:
var version = [2]uint8 // version 0.5
То есть нужно сделать как-то так что если версия больше чем version , допустим [2]uint8 <0,10>-> выдать ошибку и если версия меньше, допустим [2]uint8 тогда тоже выдать ошибку. Как это можно реализовать?
Отслеживать
задан 3 фев 2019 в 21:15
309 3 3 серебряных знака 15 15 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Массивы (не слайсы!) в го можно сравнивать:
var ( v1 = [2]int v2 = [2]int v3 = [2]int ) fmt.Println(v1 == v3, v1 == v2) // true false
А вообще, для сравнения версий лучше использовать библиотеки. В случае СемВера можно воспользоваться вот этой: https://godoc.org/github.com/blang/semver.
Отслеживать
ответ дан 4 фев 2019 в 6:25
15.9k 3 3 золотых знака 24 24 серебряных знака 41 41 бронзовый знак
Ссылка на семантическое версионирование на русском.
4 фев 2019 в 7:42
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник: ru.stackoverflow.com