.: NSIS - все вопросы :. часть 2.
-
Flix
Re: .: NSIS - все вопросы :. часть 2.
Вот спасибо. Пол дня пытался понять, что не так. Я и подозревал, что что то считывается невидимое, потому что, если напрямую присваивал любые одинаковые значения, то было всё правильно.
Начну знакомство с очисткой.
P.S. Я так понял, что нельзя в моём конкретном примере обойтись как нибудь без $\n и неизвестной для меня очистки? Ведь будет только одна строка.
Начну знакомство с очисткой.
P.S. Я так понял, что нельзя в моём конкретном примере обойтись как нибудь без $\n и неизвестной для меня очистки? Ведь будет только одна строка.
-
inco1
Re: .: NSIS - все вопросы :. часть 2.
Всем доброго дня.
Подскажите пожалуйста, как правильно и оптимально кратко прописать проверку всех серверных версий, чтобы получилось примерно так: "Если запущено на любой серверной виндовс, то...".
Код:
Не на чем проверить.
Подскажите пожалуйста, как правильно и оптимально кратко прописать проверку всех серверных версий, чтобы получилось примерно так: "Если запущено на любой серверной виндовс, то...".
Код:
Код: Выделить всё
${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
-
iglezz
Re: .: NSIS - все вопросы :. часть 2.
Цитата inco1:
откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы?
Кроме ID винта, используют MAC сетевухи, время создания системных каталогов или всё это в совокупности + иногда математика с этими данными...
откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы?
.: NSIS - все вопросы :. часть 2.
Кроме ID винта, используют MAC сетевухи, время создания системных каталогов или всё это в совокупности + иногда математика с этими данными...
-
iglezz
Re: .: NSIS - все вопросы :. часть 2.
MKN, приветствую.
Как записать ID винта? Или ID винта это его серийный номер?
Как записать ID винта? Или ID винта это его серийный номер?
-
inco1
Re: .: NSIS - все вопросы :. часть 2.
iglezz, Приветствую. Тут еще появилась проблема. Можно как то прописать, чтобы екзешник не запускал себя повторно , если найден процесс с его именем? Всё перерыл, ничего не подходит.
-
inco1
Re: .: NSIS - все вопросы :. часть 2.
iglezz, Доброго вам дня и здоровья.
Походу в вашем коде поиска строки баг. Вчера целый день потратил, чтобы найти проблему. Я то ведь сразу вставлял ваш код в мой огромный код и строку не искало. А экзешник с одного вашего кода четко и быстро находит. Я потом давай убирать с моего кода по строкам всё, пока не нашел причину.
Вот экзешник с вашим кодом, который прекрасно находит слово "Word.com" в файле hosts:
Код:
А вот в код добавлена функция с двумя строчками и он перестал искать.
Код:
Походу в вашем коде поиска строки баг. Вчера целый день потратил, чтобы найти проблему. Я то ведь сразу вставлял ваш код в мой огромный код и строку не искало. А экзешник с одного вашего кода четко и быстро находит. Я потом давай убирать с моего кода по строкам всё, пока не нашел причину.
Вот экзешник с вашим кодом, который прекрасно находит слово "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.
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
Цитата:
Простейший цикл последовательного чтения файла:
Код
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.
Пример под спойлером годится для извлечения/поиска информации, для [пере]записи будет несколько по другому.
пример
[spoiler]Код: [/spoiler]
пример
[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.
iglezz, Спасибо за пример, но я так вообще и не понял, как к этому примеру прикрутить мой файл "test.txt" и искомую фразу "test-test", как в моём примере выше.