Цитата BuZzOFF:
Как отфильтровать так, чтоб добавлялась только последняя версия каждой программы. »
|
Предположим у нас есть файл list.txt со списком одноимённых приложений разных версий :
Код:

Camera Raw CC 9.6 win32
Camera Raw CC 9.6.1 win32
Camera Raw CC 9.6.2 win32
Прочтём его и отфильтруем версии (как вариант) :
Код:

OutFile NewVerFilter.exe
!include "LogicLib.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"
Var /global Str
Var /global Ver
Var /global SumVer
Var /global Ver1
Var /global Ver2
Var /global Ver3
Section
FileOpen $R4 "$EXEDIR\list.txt" r
IfErrors done
ClearErrors
${LineSum} "$EXEDIR\list.txt" $8 ; количество строк в list.txt
StrCpy $3 0
${Do}
IntOp $3 $3 + 1 ; нумерация читаемых строк
${LineRead} "$EXEDIR\list.txt" "$3" $Str ; читаем строку № $3
;MessageBox MB_OK|MB_ICONINFORMATION "$3 -$Str "
${If} $Str == ""
Goto Next
${EndIf}
; выбираем версию из названия приложения
${WordFind2X} "$Str" " " "" "-3}}" $Ver
StrCpy $Ver $Ver -9 ; отсекаем n символов от конца (n-количество, в зависимости от того, как построен список приложений)
;MessageBox MB_OK|MB_ICONINFORMATION "$Ver"
StrCpy $SumVer "$SumVer$Ver-" ; собираем все версии в одну переменную, добавив разделитель -
Next:
${If} $3 > $8 ; если номер текущей строки > кол-ва строк - выход из цикла
${ExitDo}
${EndIf}
${Loop}
done:
FileClose $R4
MessageBox MB_OK|MB_ICONINFORMATION "Все версии: $SumVer" ; 9.6-9.6.1-9.6.2-
; разделяем версии для дальнейшего сравнения
${WordFind} "$SumVer" "-" "+1" "$Ver1" ;
${WordFind} "$SumVer" "-" "+2" "$Ver2" ;
${WordFind} "$SumVer" "-" "+3" "$Ver3" ;
MessageBox MB_OK|MB_ICONINFORMATION "$Ver1$\r$\n$Ver2$\r$\n$Ver3"
;далее последовательно сравниваем и оставляем только самую новую версию :
${VersionCompare} "$ver1" "$ver2" $R0
;если $R0=0 - Версии равны
;если $R0=1 - $ver1 новее
;если $R0=2 - $ver2 новее
MessageBox MB_OK|MB_ICONINFORMATION "$R0"
; и далее логика сравнения версий и оставление более новой....
SectionEnd
Если в списке разноимённые приложения, сначала последовательно выбираем версии в каждом из одноимённых приложений. Вариантов много.