|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
Профиль | Отправить PM | Цитировать
Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
------- Отправлено: 12:02, 09-12-2012 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Пример из справочника плох тем, что он немного неправильный по части реализации и устаревший (${NSIS_VERSION} < 3 && ANSI).
Базовый пример для проверки на запуск копии приложения есть в базовой справке. Более правильный пример с автопереключеніем на уже запущенную копию есть на сайте - Allow only one installer instance. |
Отправлено: 18:39, 02-04-2023 | #2701 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz, приветствую.
Цитата:
FileOpen $0 "test.txt" R ${LineSum} "test.txt" $R0 StrCpy $R1 0 readnext: IntOp $R1 $R1 + 1 IntCmp $R1 $R0 0 0 end ${LineRead} "test.txt" "$R1" $R3 ${WordFind} "$R3" "test-test" "E+1{" $R2 IfErrors readnext 0 MessageBox MB_OK "Найдена фраза ( test-test )" end: FileClose $0 |
|
Последний раз редактировалось inco1, 07-04-2023 в 12:35. Отправлено: 03:22, 07-04-2023 | #2702 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Пример под спойлером годится для извлечения/поиска информации, для [пере]записи будет несколько по другому.
пример
ShowInstDetails show RequestExecutionLevel user !include Util.nsh !include LogicLib.nsh !include StrFunc.nsh ${Using:StrFunc} StrLoc !define FileReadAuto `!insertmacro FileReadAuto` !macro FileReadAuto ISUTF16LE HANDLE READLINE StrCmp ${ISUTF16LE} 0 0 +3 FileRead ${HANDLE} ${READLINE} Goto +2 FileReadUTF16LE ${HANDLE} ${READLINE} !macroend !define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p` /* { номер строки (начинается с 1), позиция искомого в строке (начинается с 0), строка, содержащая искомую строку } */ !define FileFindStr `!insertmacro FileFindStr` !macro FileFindStr OUTPUT FILENAME STRTOFIND Push '${STRTOFIND}' Push '${FILENAME}' ${CallArtificialFunction} FileFindStr_macro Pop ${OUTPUT} !macroend !macro FileFindStr_macro Exch $0 ; [in] FileName / [out] ReturnStructAddr Exch Exch $1 ; StrToFind Push $2 ; FileHandle Push $3 ; ISUTF16LEFlag Push $4 ; ReadData Push $5 ; StrToFindLine Push $6 ; StrToFindPosInLine Push $7 ; ReturnStructAddr ; инициализация переменных StrCpy $5 0 ; Reset Line counter StrCpy $7 0 ; Reset ReturnStructAddr FileOpen $2 $0 R IfErrors FileFindStr_macro_end ; определение читающей инструкции (FileRead | FileReadUTF16LE) FileReadWord $2 $4 ${If} $4 = 0xFEFF StrCpy $3 1 ${Else} StrCpy $3 0 ${EndIf} FileSeek $2 0 SET ; основной цикл построчного чтения файла ${Do} ${FileReadAuto} $3 $2 $4 ${IfThen} ${Errors} ${|} ${ExitDo} ${|} IntOp $5 $5 + 1 ${StrLoc} $6 $4 $1 > ${If} $6 != '' ; если строка найдена -> пишем результат в структуру .. System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7' ; .. и выходим ${ExitDo} ${EndIf} ${Loop} FileClose $2 FileFindStr_macro_end: StrCpy $0 $7 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !macroend Section ${FileFindStr} $0 '${NSISDIR}\Include\StrFunc.nsh' 'macro ' ${If} $0 <> 0 ; распаковка структуры System::Call '*$0${FileFindStrStruct} (.r1, .r2, .r3)' DetailPrint 'Line: $1' DetailPrint 'Pos: $2' DetailPrint 'Str: $3' ${EndIf} SectionEnd |
Последний раз редактировалось iglezz, 07-04-2023 в 17:06. Отправлено: 13:09, 07-04-2023 | #2703 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz, Спасибо за пример, но я так вообще и не понял, как к этому примеру прикрутить мой файл "test.txt" и искомую фразу "test-test", как в моём примере выше.
|
Отправлено: 16:42, 07-04-2023 | #2704 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать |
Отправлено: 17:09, 07-04-2023 | #2705 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz, еще раз благодарю. Долго же до меня доходят очевидные вещи. Видать возраст.
|
Отправлено: 17:37, 07-04-2023 | #2706 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать Еще такой интересный вопрос. Как правильно сравнить две переменные?
Например, есть переменные $R5 и $R6. В обеих есть некое значение из цифр и английских букв. Это неизвестное значение может быть, как одинаковым, так и разным. Код, что ниже не работает, хотя я для теста специально ставил в переменные одинаковые значения - "0x03e700ff" , а показывало $R5 != "0x03e700ff", а когда менял местами $R5 и $R6, то показывало $R6 != "0x03e700ff". Что подтверждает, что значения в переменных одинаковы. Что еще можно использовать для данной ситуации? |
Отправлено: 20:10, 07-04-2023 | #2707 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Цитата inco1:
Цитата inco1:
StrCmp для чисел подходит только в случае, когда гарантированно совпадёт система счисления. Число 16 (десятичное) может быть записано как 0x10 (шестнадцатеричная) или 020 (восьмеричная) и для IntCmp все эти формы одинаковы. |
||
Отправлено: 21:58, 07-04-2023 | #2708 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz,
Ну да, должен работать, но не работает. Вот с этого кода скомпилите экзешник и сами убедитесь: RequestExecutionLevel user OutFile "test.exe" !include "LogicLib.nsh" !include "WordFunc.nsh" !include "TextFunc.nsh" Function .onInit StrCpy $R6 "c:\" System::Call 'Kernel32::GetVolumeInformation(t "$R6",t.r3,i ${NSIS_MAX_STRLEN},*i,*i,*i.r1,t.r2,i ${NSIS_MAX_STRLEN})i.r0' ${If} $0 <> 0 IntFmt $1 "%#.8x" $1 StrCpy $R7 "$1" ${EndIf} ${LineSum} "Info.txt" $R0 StrCpy $R1 0 IntOp $R1 $R1 + 1 IntCmp $R1 $R0 0 0 end ${LineRead} "Info.txt" "$R1" $R3 end: StrCpy $R8 "$R3" FunctionEnd Section Message MessageBox MB_OK " 1значение $R7 - 2значение $R8 " StrCmp $R7 "$R8" Well Unequal Well: MessageBox MB_OK "Значения равны" Goto Next Unequal: MessageBox MB_OK "Значения не равны" Next: StrCmp $R7 '$R8' 0 +3 DetailPrint '$$R7 == "$R8"' Goto +2 DetailPrint '$$R7 != "$R8"' SectionEnd Section File FileOpen $0 "Info.txt" w FileWrite $0 "$R7$\r$\n" FileClose $0 SectionEnd |
Отправлено: 22:54, 07-04-2023 | #2709 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать |
Отправлено: 23:10, 07-04-2023 | #2710 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
[архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 |
|