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

iglezz
03-02-2022, 12:36
S60Team, А не достаточно просто номер сборки глянуть? Вроде десятка до 22000 не поднимается.

В целом для проверки версий есть GetWinVer и WinVer.nsh (текущая версия на гитхабе (https://github.com/kichik/nsis/blob/master/Include/WinVer.nsh))

S60Team
03-02-2022, 15:25
iglezz, благодарю!
1. У 11ки номера сборок: 21996 и 22000. А вдруг билд 10ки 22H1 будет 22100?
2. Просто не хотелось подключать лишние библиотеки. Об этой версии не знал.
ЗЫ: если интересно, исходный код: https://gist.github.com/S60Team/36a48718640205e14b8a068b2b809c1f (http://is.gd/onoluw)

динозавра
05-02-2022, 23:40
Всем доброго вечера. Нужна помощь. Никак не могу сообразить, как удалить строчку с файла .xml.
Имеется файл
<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<Other Code="Некое значение">
<Data key="Некое значение">Некое значение</Data>
</Other>
<Paday Code="Некое значение">
<Data key="DelayPuk">999</Data>
</Paday>
</Configuration>
Как удалить из этого файла строчку
<Data key="DelayPuk">999</Data>
Примеров почти нету. А с удалением строчки вообще примера не нашел.

iglezz
06-02-2022, 01:10
динозавра,
Пример почти такой же как и 2.5 года назад - тыц (http://forum.oszone.net/post-2887978-2311.html)

nsisXML::select с почти идентичным селектором
nsisXML::parentNode вернёт в нужный регистр ссылку на родителя
nsisXML::removeChild удалит найденное в ::select

динозавра
06-02-2022, 01:25
Спасибо. Буду дерзать. Совсем запутался.
.

динозавра
06-02-2022, 09:55
iglezz,
Ура, получилось. Удаляет эту строчку. Но не совсем ура. Удаляет только в том случае, если эта строчка имеется в файле .xml. Если ее нет, то экзешник крошится.
Как прикрутить сюда проверку этой самой строчки, чтобы типа, если ее нет, то ничего не делать, а если есть, то удалить?

iglezz
06-02-2022, 10:38
динозавра, Ну это же в документации есть:nsisXML::select <XPath expression>
find the first node matching the given XPath expression and return its
reference in $1 and $2
if not found, reference will be 0
Если select вернёт 0 в вышеуказанных регистрах, то искомого выражения в файле нет и следующий за select`ом parentNode вызовет сбой.

динозавра
06-02-2022, 11:16
iglezz,
Спасибо.
Все понятно.
Работает.

динозавра
06-02-2022, 21:35
Всем доброго вечера. Опять нуждаюсь в помощи. Такая ситуация. На компе две или более учёток. Одна админ, остальные челядь. Установщик работает из под админа и устанавливает много чего в разные папки, реестр, драйвера. Но нужно установить обязательно всем пользователям папки с файлом по такому пути SetShellVarContext current $APPDATA\Папка\файл или $LOCALAPPDATA\Папка\файл. На всех компах учетки с разными именами. Абсолютный путь не катит. При такой прописке переменных, как я показал, кто бы не устанавливал, а достается одному админу. Остальным никак. Как это можно прописать, чтобы и остальным устанавливались папки?

iglezz
08-02-2022, 02:34
динозавра,
Пример обхода учёток на локальном компе - EnumUsersRegEx.nsh (https://github.com/iglezz/NSIS-examples/blob/master/Include/EnumUsersRegEx.nsh) + Example (https://github.com/iglezz/NSIS-examples/blob/master/Examples/EnumUsersRegEx.nsi).

inco1
08-02-2022, 02:48
динозавра,
Это можно сделать с помощью макроса от kotkovets.
!include "MUI2.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile GetUserSID.exe
Caption "GetUserSID"

!define GetUserSID "!insertmacro CallGetUserSID"

!macro CallGetUserSID USERNAME SID
System::Store S
StrCpy '$0' '${USERNAME}'
StrCmp '$0' '' 0 +2
ExpandEnvStrings '$0' "%USERNAME%"
System::Call "*(&t1024)i.r1"
System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
IntCmp $0 1 0 +2 +2
System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
IntCmp $0 1 +2 0 0
Push error
System::Free $1
System::Store L
Pop "${SID}"
!macroend

!ifdef NSIS_UNICODE
!define STR %s
!else
!define STR %S
!endif

Section
System::Call "netapi32::NetQueryDisplayInformation(wn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.R0,*i.R1)i.R4"
${If} $R4 = 0
${For} $R4 1 $R0
System::Call "*$R1(i.R2,i.R3,i,w,i,i)"
IntFmt '$R2' ${STR} $R2
IntFmt '$R3' ${STR} $R3
${GetUserSID} '$R2' '$R5'
IntOp $R1 $R1 + 24

SetOutPath "C:\Users\$R2\AppData\Roaming\test"
File "test.txt"

${Next}
System::Call "netapi32::NetApiBufferFree(iR1)"
${EndIf}
SectionEnd
Установит всем пользователям файл "test.txt" в директорию "C:\Users\%UserName%\AppData\Roaming\test"
Будет установлено всем найденным пользователям и активным и не активированным. Незадача в том, что в директории "Пользователи" могут появятся папки не активированных пользователей таких, как "Гость", "Администратор".
Как привинтить сюда фильтр, чтобы не устанавливалось не активированным пользователям понятия не имею.

динозавра
08-02-2022, 13:02
iglezz,
Спасибо, но там без чекушки ничего не понятно, а после чекушки вообще.
inco1,
Это правильно работает, но на семерке в папку SetShellVarContext current $APPDATA добавились 2 профиля встроенных пользователей Гость и Администратор. А на одиннадцатой к ним присоединились интернетовский и еще какой то. Все эти учетки не активны. Не могу прикрутить логику, чтобы их отсеять. Может знатоки помогут в этом деле. Пробовал вот так, но не отсеиваются. Видимо нужен подход не моего уровня.

!include "MUI2.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile GetUserSID.exe
Caption "GetUserSID"

!define GetUserSID "!insertmacro CallGetUserSID"

!macro CallGetUserSID USERNAME SID
System::Store S
StrCpy '$0' '${USERNAME}'
StrCmp '$0' '' 0 +2
ExpandEnvStrings '$0' "%USERNAME%"
System::Call "*(&t1024)i.r1"
System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
IntCmp $0 1 0 +2 +2
System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
IntCmp $0 1 +2 0 0
Push error
System::Free $1
System::Store L
Pop "${SID}"
!macroend

!ifdef NSIS_UNICODE
!define STR %s
!else
!define STR %S
!endif

Section
System::Call "netapi32::NetQueryDisplayInformation(wn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.R0,*i.R1)i.R4"
${If} $R4 = 0
${For} $R4 1 $R0
System::Call "*$R1(i.R2,i.R3,i,w,i,i)"
IntFmt '$R2' ${STR} $R2
IntFmt '$R3' ${STR} $R3
${GetUserSID} '$R2' '$R5'
IntOp $R1 $R1 + 24

StrCpy $R6 "$R2"
StrCpy $R7 "C:\Users\$R6"

StrCmp $R7 0 Not

SetOutPath "C:\Users\$R2\AppData\Roaming\test"
File "test.txt"

Not:

${Next}
System::Call "netapi32::NetApiBufferFree(iR1)"
${EndIf}
SectionEnd

Kopejkin
14-02-2022, 14:53
Приветствую! Пожалуйста, помогите разобраться, где косяк. Пытаюсь использовать плагин WPatch (http://wiz0u.free.fr/prog/WPatch). Пример отлично отрабатывает изменение файлов, а мой сценарий - нет. Никаких ошибок. В общем, застрял я и не могу понять, в чем причина.


Name "Sample WPatch"
OutFile Sample.exe
ShowInstDetails show
InstallDir "$PROGRAMFILES\MOBILedit Enterprise"
Page directory
Page instfiles

Section "-Backup"
SetOutPath $INSTDIR
CreateDirectory "$INSTDIR\Backup"
CopyFiles /SILENT $INSTDIR\Czech $INSTDIR\Backup 22000
Sleep 500
SectionEnd

Section
InitPluginsDir
SectionEnd

!include WGenPatDir.nsh

Section
IfErrors 0 +2
MessageBox MB_OK "There has been some errors !"
SectionEnd

iglezz
14-02-2022, 16:09
Kopejkin,
Самое важное находится в WGenPatDir.nsh. Его содержимое вопросов не вызывает?

Kopejkin
14-02-2022, 17:58
Не вызывал, потому как и пример и мой сценарий работают с одним и тем же файлом WGenPatDir.nsh. Да и не знаю, что может в нем вызывать сомнения. Он создается автоматически при создании файла различий.
Если нужен:
!ifndef ADDEDSOURCE
!define ADDEDSOURCE 'changes\'
!endif

Function Patch
DetailPrint 'Patch: $0'
StrCpy $0 '$INSTDIR\$0'
retry:
WPatch::PatchFile /NOUNLOAD ; expects $0:file path, $1:options, $2:patch path
IntCmp $1 0 continue can_skip 0
SetErrors
can_skip:
SetDetailsPrint listonly
DetailPrint '=> Error $1'
SetDetailsPrint both
IntCmp $1 1 0 continue continue
MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(^FileError_NoIgnore) /SD IDCANCEL IDRETRY retry
Abort
continue:
FunctionEnd

Section 'ApplyPatch'
ClearErrors
SetOutPath '$PLUGINSDIR'
File WGenPatDir.pat
StrCpy $2 '$PLUGINSDIR\WGenPatDir.pat'
DetailPrint 'Checking before patch...'

StrCpy $0 'Czech\AppRoot.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 12'
Call Patch
StrCpy $0 'Czech\Archive.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 5915'
Call Patch
StrCpy $0 'Czech\Backup.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 7380'
Call Patch
StrCpy $0 'Czech\DataSource.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 9288'
Call Patch
StrCpy $0 'Czech\Error.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 10335'
Call Patch
StrCpy $0 'Czech\Exports.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 11501'
Call Patch
StrCpy $0 'Czech\FormatGUI.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 19057'
Call Patch
StrCpy $0 'Czech\Internet.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 36154'
Call Patch
StrCpy $0 'Czech\ItunesBackup.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 39281'
Call Patch
StrCpy $0 'Czech\Main.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 41655'
Call Patch
StrCpy $0 'Czech\mewconad.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 957752'
Call Patch
StrCpy $0 'Czech\mewconad.xml' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 961083'
Call Patch
StrCpy $0 'Czech\mewconap.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 963777'
Call Patch
StrCpy $0 'Czech\mewconap.xml' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 966308'
Call Patch
StrCpy $0 'Czech\mewconts.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 968220'
Call Patch
StrCpy $0 'Czech\mewconts.xml' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 970789'
Call Patch
StrCpy $0 'Czech\NewsTemplate.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 972759'
Call Patch
StrCpy $0 'Czech\Offline.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 973148'
Call Patch
StrCpy $0 'Czech\Online.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 975493'
Call Patch
StrCpy $0 'Czech\Outlook.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 978946'
Call Patch
StrCpy $0 'Czech\PlugBook.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 979935'
Call Patch
StrCpy $0 'Czech\PlugCopy.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1023434'
Call Patch
StrCpy $0 'Czech\PlugData.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1063175'
Call Patch
StrCpy $0 'Czech\PlugEmail.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1137068'
Call Patch
StrCpy $0 'Czech\PlugFS.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1138337'
Call Patch
StrCpy $0 'Czech\PlugHex.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1169032'
Call Patch
StrCpy $0 'Czech\PlugNetworks.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1171900'
Call Patch
StrCpy $0 'Czech\PlugOrgan.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1172654'
Call Patch
StrCpy $0 'Czech\PlugPhoto.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1189998'
Call Patch
StrCpy $0 'Czech\PlugRing.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1205611'
Call Patch
StrCpy $0 'Czech\PlugSMS.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1232991'
Call Patch
StrCpy $0 'Czech\PlugTools.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1261257'
Call Patch
StrCpy $0 'Czech\PlugWipe.lang' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1264069'
Call Patch
StrCpy $0 'Czech\ReplugPort.htm' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1273139'
Call Patch
StrCpy $0 'Czech\rootinfo.dat' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1274227'
Call Patch
StrCpy $0 'Czech\ToolkitPro.Resource.dll' ; Check modified file
StrCpy $1 '/CHECK /PRECISE 1277377'
Call Patch

IfErrors 0 +3
SetErrors
Goto end_of_patch
DetailPrint 'Beginning real patch...'

StrCpy $0 'Czech\AppRoot.htm' ; Modified file
StrCpy $1 '/PRECISE 12'
Call Patch
StrCpy $0 'Czech\Archive.htm' ; Modified file
StrCpy $1 '/PRECISE 5915'
Call Patch
StrCpy $0 'Czech\Backup.htm' ; Modified file
StrCpy $1 '/PRECISE 7380'
Call Patch
StrCpy $0 'Czech\DataSource.htm' ; Modified file
StrCpy $1 '/PRECISE 9288'
Call Patch
StrCpy $0 'Czech\Error.htm' ; Modified file
StrCpy $1 '/PRECISE 10335'
Call Patch
StrCpy $0 'Czech\Exports.lang' ; Modified file
StrCpy $1 '/PRECISE 11501'
Call Patch
StrCpy $0 'Czech\FormatGUI.lang' ; Modified file
StrCpy $1 '/PRECISE 19057'
Call Patch
StrCpy $0 'Czech\Internet.htm' ; Modified file
StrCpy $1 '/PRECISE 36154'
Call Patch
StrCpy $0 'Czech\ItunesBackup.htm' ; Modified file
StrCpy $1 '/PRECISE 39281'
Call Patch
StrCpy $0 'Czech\Main.lang' ; Modified file
StrCpy $1 '/PRECISE 41655'
Call Patch
StrCpy $0 'Czech\mewconad.htm' ; Modified file
StrCpy $1 '/PRECISE 957752'
Call Patch
StrCpy $0 'Czech\mewconad.xml' ; Modified file
StrCpy $1 '/PRECISE 961083'
Call Patch
StrCpy $0 'Czech\mewconap.htm' ; Modified file
StrCpy $1 '/PRECISE 963777'
Call Patch
StrCpy $0 'Czech\mewconap.xml' ; Modified file
StrCpy $1 '/PRECISE 966308'
Call Patch
StrCpy $0 'Czech\mewconts.htm' ; Modified file
StrCpy $1 '/PRECISE 968220'
Call Patch
StrCpy $0 'Czech\mewconts.xml' ; Modified file
StrCpy $1 '/PRECISE 970789'
Call Patch
StrCpy $0 'Czech\NewsTemplate.htm' ; Modified file
StrCpy $1 '/PRECISE 972759'
Call Patch
StrCpy $0 'Czech\Offline.htm' ; Modified file
StrCpy $1 '/PRECISE 973148'
Call Patch
StrCpy $0 'Czech\Online.htm' ; Modified file
StrCpy $1 '/PRECISE 975493'
Call Patch
StrCpy $0 'Czech\Outlook.htm' ; Modified file
StrCpy $1 '/PRECISE 978946'
Call Patch
StrCpy $0 'Czech\PlugBook.lang' ; Modified file
StrCpy $1 '/PRECISE 979935'
Call Patch
StrCpy $0 'Czech\PlugCopy.lang' ; Modified file
StrCpy $1 '/PRECISE 1023434'
Call Patch
StrCpy $0 'Czech\PlugData.lang' ; Modified file
StrCpy $1 '/PRECISE 1063175'
Call Patch
StrCpy $0 'Czech\PlugEmail.lang' ; Modified file
StrCpy $1 '/PRECISE 1137068'
Call Patch
StrCpy $0 'Czech\PlugFS.lang' ; Modified file
StrCpy $1 '/PRECISE 1138337'
Call Patch
StrCpy $0 'Czech\PlugHex.lang' ; Modified file
StrCpy $1 '/PRECISE 1169032'
Call Patch
StrCpy $0 'Czech\PlugNetworks.lang' ; Modified file
StrCpy $1 '/PRECISE 1171900'
Call Patch
StrCpy $0 'Czech\PlugOrgan.lang' ; Modified file
StrCpy $1 '/PRECISE 1172654'
Call Patch
StrCpy $0 'Czech\PlugPhoto.lang' ; Modified file
StrCpy $1 '/PRECISE 1189998'
Call Patch
StrCpy $0 'Czech\PlugRing.lang' ; Modified file
StrCpy $1 '/PRECISE 1205611'
Call Patch
StrCpy $0 'Czech\PlugSMS.lang' ; Modified file
StrCpy $1 '/PRECISE 1232991'
Call Patch
StrCpy $0 'Czech\PlugTools.lang' ; Modified file
StrCpy $1 '/PRECISE 1261257'
Call Patch
StrCpy $0 'Czech\PlugWipe.lang' ; Modified file
StrCpy $1 '/PRECISE 1264069'
Call Patch
StrCpy $0 'Czech\ReplugPort.htm' ; Modified file
StrCpy $1 '/PRECISE 1273139'
Call Patch
StrCpy $0 'Czech\rootinfo.dat' ; Modified file
StrCpy $1 '/PRECISE 1274227'
Call Patch
StrCpy $0 'Czech\ToolkitPro.Resource.dll' ; Modified file
StrCpy $1 '/PRECISE 1277377'
Call Patch

end_of_patch:
StrCpy $1 '/UNLOAD'
WPatch::PatchFile
Delete $2
; Now you should check for IfErrors ...
SectionEnd

iglezz
14-02-2022, 19:21
Kopejkin, Не имея набора файлов (оба каталога для WGenPatDir.exe и каталог с файлами установленной программы), достаточного для сборки скрипта и теста результата, трудно сказать определённо.
Проблема только с пропатчиванием или также с секциями -Backup и -Main? Во втором случае стоит внимательно посмотреть на функцию CheckFile, она несколько путано написана.
Можно поискать проблемное место методом отключения ненужных для проверки частей скрипта и выводом отладочной информации через DetailPrint или в файл через FileWrite.

ЗЫ
Блок Section
InitPluginsDir
SectionEnd можно удалить, т.к. InitPluginsDir уже исполняется в .onInit

Kopejkin
14-02-2022, 19:53
Запускается все из одной папки, и "пример" и "мой". В "моем" все работает (проверяется, меняется, копируется), кроме пропатчивания. Смотрел DetailPrint на оба варианта. В "примере" пишет:
"Extract: WGenPatDir.pat...100%"
В "моем":
"Extract: WGenPatDir.pat"
Может файл не извлекается? Почему?
От безысходности пытался посмотреть, извлекается ли этот файл во временную папку. Но не увидел ни в первом, ни во втором варианте. Даже пытался тупо скопировать его во временную папку до начала процесса пропатчивания. Не помогло.

iglezz
14-02-2022, 22:32
Kopejkin, Небольшая модификация функции Patch в примере показала, что плагин ничерта не пропатчил
nsis 3.08, ansi/unicode, проверено на Win10 x64 21h2, Win7 x86

Тут к автору плагина стучаться надо, если это ещё возможно.
Function Patch
SetDetailsPrint listonly
StrCpy $0 '$INSTDIR\$0'

StrCpy $R1 $1 8
StrCmp $R1 '/PRECISE' 0 +4
DetailPrint 'f: $0'
md5dll::GetMD5File "$0"
Pop $R2
retry:
WPatch::PatchFile /NOUNLOAD ; expects $0:file path, $1:options, $2:patch path

StrCmp $R1 '/PRECISE' 0 +7
md5dll::GetMD5File "$0"
Pop $R3
StrCmp $R2 $R3 +4 0
DetailPrint "MD5 original $R2"
DetailPrint "MD5 patched $R3"
DetailPrint " "

IntCmp $1 0 continue can_skip 0
SetErrors
can_skip:
SetDetailsPrint listonly
DetailPrint '=> Error $1'
SetDetailsPrint both
IntCmp $1 1 0 continue continue
MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(^FileError_NoIgnore) /SD IDCANCEL IDRETRY retry
Abort
continue:
SetDetailsPrint none
FunctionEnd

Kopejkin
14-02-2022, 23:11
Спасибо, что заморочились. Для меня это сложновато. Накарябал кучу текста для штатного плагина VPatch. Все работает. Еще раз, спасибо!

динозавра
15-02-2022, 19:03
Приветствую всех. Перелопатил всю справку, но не нашел переименования папки. Ткните носом, если это есть в нашей справке.
Нужно следующее: если по такому то пути найдена папка "Вася", то переименовать ее на "Вова".




© OSzone.net 2001-2012