.: NSIS - все вопросы :. часть 2.

Ответить
 • Просмотры: 22
Аватара пользователя
Flix

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Flix »

Вот спасибо. Пол дня пытался понять, что не так. Я и подозревал, что что то считывается невидимое, потому что, если напрямую присваивал любые одинаковые значения, то было всё правильно.

Начну знакомство с очисткой.



P.S. Я так понял, что нельзя в моём конкретном примере обойтись как нибудь без $\n и неизвестной для меня очистки? Ведь будет только одна строка.
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

Всем доброго дня.

Подскажите пожалуйста, как правильно и оптимально кратко прописать проверку всех серверных версий, чтобы получилось примерно так: "Если запущено на любой серверной виндовс, то...".





Код:

Код: Выделить всё

     ${If} ${IsWin2003}
     ${orIf} ${IsWin2003R2}
     ${orIf} ${IsWin2008}
     ${orIf} ${IsWin2008R2}
     ${orIf} ${IsWin2012}
     ${orIf} ${IsWin2012R2}
     ${orIf} ${IsWin2016}
     ${orIf} ${IsWin2019}
     ${orIf} ${IsWin2022}
   DetailPrint "Running on Windows Server"
     ${EndIf}

Не на чем проверить.
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Должно быть достаточно ${If} ${IsServerOS} ...
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Цитата inco1:



откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы?
.: NSIS - все вопросы :. часть 2.




Кроме ID винта, используют MAC сетевухи, время создания системных каталогов или всё это в совокупности + иногда математика с этими данными...
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

MKN, приветствую.

Как записать ID винта? Или ID винта это его серийный номер?
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

iglezz, Приветствую. Тут еще появилась проблема. Можно как то прописать, чтобы екзешник не запускал себя повторно , если найден процесс с его именем? Всё перерыл, ничего не подходит.
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

iglezz, Доброго вам дня и здоровья.



Походу в вашем коде поиска строки баг. Вчера целый день потратил, чтобы найти проблему. Я то ведь сразу вставлял ваш код в мой огромный код и строку не искало. А экзешник с одного вашего кода четко и быстро находит. Я потом давай убирать с моего кода по строкам всё, пока не нашел причину.



Вот экзешник с вашим кодом, который прекрасно находит слово "Word.com" в файле hosts:





Код:

Код: Выделить всё

RequestExecutionLevel user
               SilentInstall silent 
                !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`
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0
    Exch
    Exch $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7
    StrCpy $5 0
    StrCpy $7 0
    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end
    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 '$SYSDIR\drivers\etc\hosts' 'Word.com'
    ${If} $0  0
           MessageBox MB_OK "        Нужное слово найдено "
    ${Else}
           MessageBox MB_OK "      Нужное слово НЕ найдено "
    ${EndIf}
SectionEnd

А вот в код добавлена функция с двумя строчками и он перестал искать.





Код:

Код: Выделить всё

RequestExecutionLevel user
               SilentInstall silent 
                !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`
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0
    Exch
    Exch $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7
    StrCpy $5 0
    StrCpy $7 0
    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end
    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 '$SYSDIR\drivers\etc\hosts' 'Word.com'
    ${If} $0  0
           MessageBox MB_OK "        Нужное слово найдено "
    ${Else}
           MessageBox MB_OK "      Нужное слово НЕ найдено "
    ${EndIf}
SectionEnd
Function .onInit
Var /GLOBAL Proga
        ReadRegStr $Proga HKLM "SOFTWARE\Test" "Test"
FunctionEnd
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

iglezz, приветствую.


Цитата:



Простейший цикл последовательного чтения файла:

Код



FileOpen $handle $filename R

${Do}

FileRead $handle $fileread

${IfThen} ${Errors} ${|} ${ExitDo} ${|}



DetailPrint '[$fileread]'

${Loop}

FileClose $handle



Ничего не получается. Можете показать пример поиска конкретной записи, вот как в этом цикле:



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
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Пример под спойлером годится для извлечения/поиска информации, для [пере]записи будет несколько по другому.





пример

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

iglezz, Спасибо за пример, но я так вообще и не понял, как к этому примеру прикрутить мой файл "test.txt" и искомую фразу "test-test", как в моём примере выше.
Ответить

Вернуться в «Автоматическая установка приложений»