Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Begin2Fly
14-09-2019, 13:54
динозавра, для этого можно воспользоваться плагином nsisxml.
динозавра
14-09-2019, 14:52
Begin2Fly,
Спасибо, но я не нашел ни одного примера использования, когда в строке файла .xml , в которой есть число (неизвестное) нужно поменять одну любую цифру на случайную или как крайний вариант на заданную.
Нужно видимо как то ко всему непонятному прикручивать генераторы случайных чисел, а я в этом плагине и прикрутке генераторов полный дуб.
Короче для меня это не реально. Я по своей наивности думал, что есть какая то простая функция типа, если в строке найдена цифра к примеру 5, то заменить на, к примеру 6 или другое, если не найдена , то искать к примеру 6 и если найдена, то заменить на 7 или любое другое. Больше думаю не нужно, их там в файле аж 24.
Это строка <Data key="TrialSerialNumber">745920021237495069785432(это чисо на каждом компе разное)</Data> в файле application.xml что с акробата C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\AMT
Хотел состряпать фикс для акробат. Там нужно добавить в реестр, применить патч и поправить фай(сбросить окончание триала). Первое и второе сделал а править файл для меня темный лес.
динозавра, вообще-то, xml-файл не имеет понятия «строка». Есть понятия разметка, тэг, атрибут, значение атрибута и т.п.
Короче для меня это не реально. Я по своей наивности думал, »
Описываете здесь полное техзадание (не забыв упаковать образец полного файла в архив и приложить к сообщению) и ждёте.
динозавра
14-09-2019, 16:44
Задача такая (машинный перевод) :
вам нужно будет отредактировать файл "application.xml", который находится в папке
C: \ Program Files (x86) \ Adobe \ Acrobat DC \ Acrobat \ AMT
измените любую цифру в поле <Data key = "TrialSerialNumber"> xxxxxxxxxxxx '
Оригинал текста тут http://w10.monkrus.ws/2019/08/adobe-acrobat-pro-dc-2019-v191220040.html
Только вот эти файлы на разных компах отличаются датой установки, местом установки может еще чем.
Отсюда и проблема, что нужно "изменить только одну любую цифру в поле <Data key = "TrialSerialNumber"> xxxxxxxxxxxx '", чтобы не изменился сам файл, ну, как бы так, если бы это было сделано вручную.
динозавра,
Вариант с изменением последней цифры
;Using https://nsis.sourceforge.io/NsisXML_plug-in_(by_Wizou)
Name "nsisXML-acrobat-example"
OutFile "nsisXML-acrobat-example.exe"
ShowInstDetails show
AutoCloseWindow false
SetOverwrite on
RequestExecutionLevel user
Page instfiles
Section ""
nsisXML::create
nsisXML::load "$EXEDIR\application.xml"
nsisXML::select '/Configuration/Other/Data[@key="TrialSerialNumber"]'
nsisXML::getText
DetailPrint "get: $3"
; Отрезаем в R1 всю строку без последней цифры
StrCpy $R1 $3 -1
; Отрезаем в R0 последнюю цифру
StrCpy $R0 $3 "" -1
; Увеличиваеи значение на 1
IntOp $R0 $R0 + 1
; Проверяем: если R0 равно 10, то записываем в R0 = 0
StrCmp $R0 10 0 +2
StrCpy $R0 0
; Подклеиваем к R1 новое значение R0
StrCpy $R1 "$R1$R0"
DetailPrint "<: $3"
DetailPrint ">: $R1"
nsisXML::setText $R1
nsisXML::save "$EXEDIR\application-new.xml"
SectionEnd
динозавра
18-09-2019, 09:48
iglezz,
Огромное спасибо. Это именно то, что я просил. Меняется одна цифра. Просто супер!
динозавра
18-09-2019, 16:50
Все удалил по причине нарушения ОПК п.3.18 (http://forum.oszone.net/rules.html#3.18)
динозавра, Вы бы с этим поосторожнее. Вы вообще в курсе существования ОПК п.3.18 (http://forum.oszone.net/rules.html#3.18)?
динозавра
18-09-2019, 17:58
Понял ошибку, лохонулся. Удалите, пожалуйста мое сообщение в кого есть права.
динозавра, Самостоятельно можно отредактировать сообщение.
Подобные многократно повторяющиеся конструкции поддерживать -- самому себе лишняя работа при дальнейших модификациях плюс прямая дорога к ошибкам.
1. Код языка записывается в регистр $0 в функции .onInit, а читается в секции. По пути $0 может многократно измениться
2. Если пользоваться такой конструкцией для установки языка сообщений, то лучше переписать код примерно так:
Var RunParamVar
Function .onInit
${GetParameters} $RunParamVar
ClearErrors
${GetOptions} $RunParamVar "/S" $1
IfErrors skip_check_param_S 0
SetSilent silent
skip_check_param_S:
IfSilent do_some_work 0
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
${If} $0 = 0419
StrCpy $msgbox_ask_text "rus text"
StrCpy $msgbox_completed_text "rus text"
${ElseIf} $0 = 0422
StrCpy $msgbox_ask_text "ukr text"
StrCpy $msgbox_completed_text "ukr text"
${Else}
StrCpy $msgbox_ask_text "english text"
StrCpy $msgbox_completed_text "english text"
${EndIf}
MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "$msgbox_ask_text" IDYES +2 IDNO 0
Abort
do_some_work:
Call MainInstructionsFunc
IfSilent +2 0
MessageBox MB_OK|MB_TOPMOST|MB_USERICON " $msgbox_completed_text"
FunctionEnd
Function MainInstructionsFunc
.....
рабочая часть скрипта
.....
FunctionEnd
Или использовать LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Ukrainian.nlf"
LangString VarName1 ${LANG_ENGLISH} "eng text"
LangString VarName1 ${LANG_RUSSIAN} "rus text"
LangString VarName1 ${LANG_UKRAINIAN} "ukr text"
.......
3. В данном скрипте подразумевается, что программа установлена в определённую папку по умолчанию.
Во избежание нестыковок лучше вычитать из реестра папку установки в переменную и использовать её в дальшейшем.
Дополнительно можно запилить проверку на то, что это именно та папка, в которую надо писать файлы.
4. DetailPrint из моего примера можно было и удалить :)
динозавра, я, конечно, могу ошибаться, т.к. пару лет кодинга вообще не касался, но начиная читать код сразу меня остановил вот этот кусок:
${If} ${RunningX64}
SetRegView 64
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\WOW6432Node\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${Else}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${EndIf}
А зачем вам команда SetRegView, если вы принудительно ветку прописываете? Могу скромно посоветовать сразу приучаться писать "логичный код", когда будут у вас скрипты большие, потом придётся переучиваться/переписывать и копаться в лишних строках.
SetRegView как раз нужна для того, чтобы скрипт сам определял, в какую ветку будет записывать данные, таким образом можно избавиться от лишних строк в коде.
либо так (без SetRegView):
${If} ${RunningX64}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\WOW6432Node\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${Else}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
${EndIf}
либо так:
${If} ${RunningX64}
SetRegView 32 ; переключаем на запись в WOW6432Node раздел
${EndIf}
WriteRegDWORD HKEY_LOCAL_MACHINE "SOFTWARE\Adobe\Adobe Acrobat\DC\Activation" "IsAMTEnforced" 0x1
Но в последнем случае, вам придётся постоянно мучать команду SetRegView, если хотите постоянно писать в разные разделы "на автомате", тут уже смотря от проекта
Вообще, если нет надобности постоянно писать в разные разделы, то лучше бы при запуске определиться с командой SetRegView...Так вы сами себя избавите в дальнейшем как минимум от лишних конструкций с ${If}
динозавра
19-09-2019, 16:12
iglezz,
По самому коду
Моей благодарности нету границ. Буду опробывать..... Но, ведь тогда не было вас, чтобы мне помочь http://forum.oszone.net/post-2857985-2254.html , и, если вы прочтете все дальнейшие решения начиная с сообщения 2254 , то они свелись к ссылке на "чужой" сайт, чем я воспользовался и оттуда взял примеры.
K.A.V.,
но начиная читать код сразу меня остановил вот этот кусок
Огромное спасибо за дополнительные решения.
Я тогда (очень давно) строго воспользовался вашей инструкцией и не отступал ни на децл http://forum.oszone.net/post-2541218-1741.html и дальнейшее после сообщения 1740
Исходные данные: дан список
string1
string2
string3
string4
Как выбрать из этого списка рандомно, одну из строк и записать в переменную?
StrCry "$1" string?
f0r_ce, какой ответ вы хотите получить с таким вопросом?
Исходные данные: дан список
string1
string2
string3
string4 »
Откуда список? В каком он в формате? Список в элементе управления (List/TreeView, Combobox и т.д.) или в текстовом файле?
K.A.V., список там же в скрипте
StrCry $1 string1
StrCry $2 string2
StrCry $3 string3
StrCry $4 string4
Далее выбор рандомно одну из них и заносим в переменную
StrCry "$5" string(?)
f0r_ce,
NsRandom (https://nsis.sourceforge.io/NsRandom_plug-in), StdUtils (https://github.com/lordmulder/stdutils/releases)
iglezz, StdUtils работает только с числами, строки не рандомит, NsRandom тоже.
f0r_ce, Понятное дело, самое интересное - получить строку относительно её номера.
Код грязноват ибо не заботится о перезаписи переменных
Name "RandomStringTest"
OutFile "RandomStringTest.exe"
ShowInstDetails show
AutoCloseWindow false
RequestExecutionLevel user
Page instfiles
Section ""
StrCpy $0 string0
StrCpy $1 string1
StrCpy $2 string2
StrCpy $3 string3
DetailPrint "input 0 = $0"
DetailPrint "input 1 = $1"
DetailPrint "input 2 = $2"
DetailPrint "input 3 = $3"
Push $0
Push $1
Push $2
Push $3
Push 4 ; (число строк)
nsRandom::GetRandom
Pop $R0 ; random 0 <= N < 4)
DetailPrint "random = $R0"
StrCpy $R1 3
loop:
IntCmp $R1 0 0 exitloop 0
IntCmp $R0 $R1 0 +2 +2
Exch $5
Pop $4
IntOp $R1 $R1 - 1
Goto loop
exitloop:
DetailPrint "result = $5"
DetailPrint " "
SectionEnd
Более корректный вариант, оформлен как функция:
Name "RandomStringTesFunc"
OutFile "RandomStringTesFunc.exe"
ShowInstDetails show
AutoCloseWindow false
RequestExecutionLevel user
Page instfiles
Section ""
StrCpy $R0 0
LoopS:
Push string1
Push string2
Push string3
Push string4
Push string5
Push 5
Call GetRandomString
Pop $0
DetailPrint "result = $0"
IntOp $R0 $R0 + 1
InTCmp $R0 20 +2 0
Goto LoopS
SectionEnd
Function GetRandomString
Exch $0 ; stack size input for nsRandom::GetRandom
Push $1 ; stack size, counts from zero
Push $2 ; temp
Push $3 ; output string
IntOp $1 $0 - 1
Push $0
nsRandom::GetRandom
Pop $0 ; get random (0 <= $0 <= $1)
loop:
IntCmp $1 0 0 exitloop 0
Exch 4
IntCmp $0 $1 0 +3 +3
Pop $3
Goto +2
Pop $2
Exch
Exch 2
Exch 3
IntOp $1 $1 - 1
Goto loop
exitloop:
Exch 3
Pop $0
Pop $2
Pop $1
Exch $3
FunctionEnd
Можно ещё проще генерить рандомное число номера переменной в коде:
Пример - до 20 :
OutFile RandomTest.exe
Function Random
Exch $0
Push $1
System::Call 'kernel32::QueryPerformanceCounter(*l.r1)'
System::Int64Op $1 % $0
Pop $0
Pop $1
Exch $0
FunctionEnd
Section
Push 20
call Random
Pop $0
MessageBox MB_OK "Random $0"
SectionEnd
AlekseyPopovv,
${GetOptions} "$CMDLINE" "/U=" $R0
${If} $R0 == 1
Заменить на
${GetOptions} "$CMDLINE" "/U" $R0
${IfNot} ${Errors}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC