PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 [116] 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

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
Хотел состряпать фикс для акробат. Там нужно добавить в реестр, применить патч и поправить фай(сбросить окончание триала). Первое и второе сделал а править файл для меня темный лес.

Iska
14-09-2019, 15:29
динозавра, вообще-то, 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 '", чтобы не изменился сам файл, ну, как бы так, если бы это было сделано вручную.

iglezz
14-09-2019, 20:57
динозавра,
Вариант с изменением последней цифры
;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)

Iska
18-09-2019, 17:51
динозавра, Вы бы с этим поосторожнее. Вы вообще в курсе существования ОПК п.3.18 (http://forum.oszone.net/rules.html#3.18)?

динозавра
18-09-2019, 17:58
Понял ошибку, лохонулся. Удалите, пожалуйста мое сообщение в кого есть права.

iglezz
18-09-2019, 18:16
динозавра, Самостоятельно можно отредактировать сообщение.


Подобные многократно повторяющиеся конструкции поддерживать -- самому себе лишняя работа при дальнейших модификациях плюс прямая дорога к ошибкам.

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 из моего примера можно было и удалить :)

K.A.V.
18-09-2019, 19:08
динозавра, я, конечно, могу ошибаться, т.к. пару лет кодинга вообще не касался, но начиная читать код сразу меня остановил вот этот кусок:


${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

f0r_ce
30-09-2019, 06:39
Исходные данные: дан список

string1
string2
string3
string4

Как выбрать из этого списка рандомно, одну из строк и записать в переменную?

StrCry "$1" string?

K.A.V.
30-09-2019, 08:24
f0r_ce, какой ответ вы хотите получить с таким вопросом?
Исходные данные: дан список
string1
string2
string3
string4 »
Откуда список? В каком он в формате? Список в элементе управления (List/TreeView, Combobox и т.д.) или в текстовом файле?

f0r_ce
30-09-2019, 10:18
K.A.V., список там же в скрипте

StrCry $1 string1
StrCry $2 string2
StrCry $3 string3
StrCry $4 string4

Далее выбор рандомно одну из них и заносим в переменную

StrCry "$5" string(?)

iglezz
30-09-2019, 10:21
f0r_ce,
NsRandom (https://nsis.sourceforge.io/NsRandom_plug-in), StdUtils (https://github.com/lordmulder/stdutils/releases)

f0r_ce
30-09-2019, 10:46
iglezz, StdUtils работает только с числами, строки не рандомит, NsRandom тоже.

iglezz
30-09-2019, 11:10
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

MKN
30-09-2019, 18:34
Можно ещё проще генерить рандомное число номера переменной в коде:
Пример - до 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

iglezz
01-10-2019, 11:19
AlekseyPopovv,
${GetOptions} "$CMDLINE" "/U=" $R0
${If} $R0 == 1
Заменить на
${GetOptions} "$CMDLINE" "/U" $R0
${IfNot} ${Errors}




© OSzone.net 2001-2012