|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
|
.: NSIS - все вопросы :. часть 2.
|
|
Ветеран Сообщения: 1216 |
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором 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 | |
|