Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
S60Team, А не достаточно просто номер сборки глянуть? Вроде десятка до 22000 не поднимается.
В целом для проверки версий есть GetWinVer и WinVer.nsh (текущая версия на гитхабе (https://github.com/kichik/nsis/blob/master/Include/WinVer.nsh))
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>
Примеров почти нету. А с удалением строчки вообще примера не нашел.
динозавра,
Пример почти такой же как и 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. Если ее нет, то экзешник крошится.
Как прикрутить сюда проверку этой самой строчки, чтобы типа, если ее нет, то ничего не делать, а если есть, то удалить?
динозавра, Ну это же в документации есть: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\Папка\файл. На всех компах учетки с разными именами. Абсолютный путь не катит. При такой прописке переменных, как я показал, кто бы не устанавливал, а достается одному админу. Остальным никак. Как это можно прописать, чтобы и остальным устанавливались папки?
динозавра,
Пример обхода учёток на локальном компе - 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).
динозавра,
Это можно сделать с помощью макроса от 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
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
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"
Может файл не извлекается? Почему?
От безысходности пытался посмотреть, извлекается ли этот файл во временную папку. Но не увидел ни в первом, ни во втором варианте. Даже пытался тупо скопировать его во временную папку до начала процесса пропатчивания. Не помогло.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC