Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
24-09-2011, 16:43
обнаружил интересные положительные свойства этого макроса »
какие? эту "апишку" я знаю хорошо, к тому же в справочнике по NSIS, Примеры кодов->Определение SID пользователя,
в макросе я добавил чуть больше возможностей использовать потенциал этой апи функции.
Дорогие товарищи помогите подчистить (подкорректировать, упростить) код:
!include "FileFunc.nsh"
!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
var dialog
var pass
var rezul
Function .onInit
${GetOptions} $CMDLINE "/PAS=" $1
IfErrors +3 0
StrCpy $rezul $1
GoTo .Done
FunctionEnd
Page custom fnCustomInit fnCustomDestroy
Function fnCustomInit
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 40% 20% 90u 12u $rezul
Pop $pass
${if} $rezul == ""
nsDialogs::Show
${endif}
FunctionEnd
Function fnCustomDestroy
${NSD_GetText} $pass $rezul
GoTo .Done
FunctionEnd
Section "MainSection" SEC01
.Done:
${ifnot} $rezul == ПАРОЛЬ
MessageBox MB_ICONSTOP "Неверный пароль !!!"
Abort ; конец иницилизации
${endif}
...
SectionEnd
Писать скрипты на NSIS начал недавно, чаще всего использовал мастер, почти незадумывался о коде, вот решил его усовершенствовать.
Вашему вниманию представляю часть кода, принцип его работы такой: Запускаем программу. Если при запуске программы указываем ключ /PAS="пароль" , тогда если пароль правильный программа устанавливается без окна запроса пароля, если пароль неправильный то ничего непроисходит. Если при установке ключ /PAS неуказывается тогда пользователю предлогается ввести пароль в окошке, естественно при правильном пароле программа устанавливается, а при неправильном нет.
Писал этот код почти по наитию, методом проб и ошибок, поэтому строго несудите. Самому неочень нравится переходы на метки, считаю что это неочень правильно но по другому еще пока неумею. Буду рад любой помощи.
kotkovets
28-09-2011, 00:55
Писать скрипты на NSIS начал недавно, чаще всего использовал мастер, почти незадумывался о коде »
Очень плохо, это очень мощный язык сценария, и сложный довольно для начинающих
Если при запуске программы указываем ключ /PAS="пароль" , тогда если пароль правильный программа устанавливается без окна запроса пароля, если пароль неправильный то ничего непроисходит »
Здесь вы упустили очень важный момент, при тихом режиме (с ключом /S) всегда будет установка,
поэтому тоже нужна еще проверка на флаг тихого режима.
неочень нравится переходы на метки, считаю что это неочень правильно »
Дикий код, но пойдет :) , накидал пример на логических конструкциях (на мой взгляд более правильный подход всегда использовать в скриптах, чем голые метки), пример на принципе если пароль неверен
вызываем функцию прерывания установки - просто и эффективно.
!include "FileFunc.nsh"
!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
outfile test.exe
var dialog
var pass
var rezul
Page custom fnCustomInit fnCustomDestroy
Page InstFiles ;страничка устаноки
Function .onInit
ClearErrors ;очищаем принудительно флаг ошибки для корректной отработки кода
${GetOptions} $CMDLINE "/PAS=" $rezul
${If} ${Silent} ;функцию проверки пароля, запускаем, если тихий режим И
${AndIf} $rezul != ПАРОЛЬ ;неверный пароль, т.е логика И
Call CheckPass
${EndIf}
ClearErrors ;очищаем принудительно флаг ошибки для корректной отработки кода
FunctionEnd
Function fnCustomInit
${If} $rezul != ПАРОЛЬ ;если ключ правильный, то не показываем кастомную страничку, если не тихий режим.
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 83u 40u 90u 12u $rezul
Pop $pass
nsDialogs::Show
${EndIf}
FunctionEnd
Function fnCustomDestroy
${NSD_GetText} $pass $rezul
${If} $rezul != ПАРОЛЬ
Call CheckPass
${EndIf}
FunctionEnd
Function CheckPass ;функция прерывания
MessageBox MB_ICONSTOP "Неверный пароль !!!"
Abort ; конец иницилизации
FunctionEnd
Section "MainSection" SEC01
MessageBox MB_ICONINFORMATION|MB_OK "$rezul" IDOK
SectionEnd
Возникла необходимость в транслитерации.
Имеем в $0 "По умолчанию"
Нужно получить в $0 "Po umolchaniu"
а лучше в $0 "\x41f\x43e \x443\x43c\x43e\x43b\x447\x430\x43d\x438\x44e"
Такое можно сделать в NSIS?
kotkovets
28-09-2011, 10:55
Нужно получить в $0 "Po umolchaniu"
а лучше в $0 "\x41f\x43e \x443\x43c\x43e\x43b\x447\x430\x43d\x438\x44e"
Такое можно сделать в NSIS? »
Можно, на алгоритм сложный(множество циклов, сравнение символов, конвертирование) - нет желания заниматься,
не очень это востребовано и столь часто необходимо.
С помощью плагина Registry (http://nsis.sourceforge.net/Registry_plug-in) можно конвертировать строку в бинарный вид и наоборот.
Полное русское описание плагина вы найдете в справочнике по NSIS, ссылку на справочник найдете в шапке темы
kotkovets, спасибо, посмотрел плагин Registry, конвертирует немного не в то чего бы хотелось.
kotkovets
28-09-2011, 14:02
конвертирует немного не в то чего бы хотелось »
Можно разложить строку на символы в цикле, и заменять каждый символ,
Например с помощью команды поддерживающий 256 символов, пример в цикле, число=символ, матрица:
Section
StrCpy $0 0
Go:
Intfmt $1 %c $0 ; в $1 символ соответствующий цифре
DetailPrint "$0 = $1"
InTop $0 $0 + 1 ;c каждым циклом увеличиваем на 1 $0
StrCmp $0 256 End
Goto Go
End:
SectionEnd
Еще вопрос...
большая буква "А"=>"x0410"
маленькая буква "а"=>"x0430"
для
StrCmp $1 "а" 0 +2
StrCpy $1 "\x430"
регистр букв не важен.
Как-то можно это обойти?
kotkovets
29-09-2011, 10:57
регистр букв не важен.
Как-то можно это обойти? »
что обойти, забор, ограждение???
забор :)
Как различить регистр букв?
StrCmp $1 "а" 0 +2
StrCpy $1 "\x430"
StrCmp $1 "А" 0 +2
StrCpy $1 "\x410"
в $1 маленькая "а" будет.
kotkovets
29-09-2011, 13:17
Как различить регистр букв? »
StrcmpS
Очередное приближение, как вариант а :drug:
!include "MUI2.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails show
outfile testing.exe
Var char
Var conv_char
Var stroka_in
Var stroka_out
Section test
;эти команды препроцессора нужны для ускорения работы цикла
;чтобы в цикле не мельтешил прогресс бар!!!
;////////////////////////////
Call :.whilefor_Next
!ifndef whilefor
!define whilefor
Goto .whilefor_End
!endif
.whilefor_Next:
;/////////////////////////////
StrCpy $0 0 ;отсчет от нулевого символа, c 192 символа начинается кирилица
StrCpy $1 206 ;шифрование символа, т.е нулевой символ = \x206, 255символ = \x461
StrCpy `$stroka_in` "абвгд"
StrLen $2 `$stroka_in` ;вычисляем длину входной строки
IntOp $2 $2 - 1
${DoUntil} $2 == -1 ;цикл если нулевая длина строки, то цикл не начнется!!!
Intfmt $char "%c" $0 ; в $char символ соответствующий цифре
Intfmt $conv_char "\x$1" $0 ;конвертируем символ в вид \xYYY
InTop $1 $1 + 1
;-----------------------
;DetailPrint "[Номер символа: $0] -> $char = $conv_char" ;$char - символ строки, $conv_char - конвертированный символ строки
;-----------------------
InTop $0 $0 + 1 ;c каждым циклом увеличиваем на 1 $0
${For} $R1 0 $2
StrCpy $5 '$stroka_in' 1 $R1 ;в цикле разбиваем входную строку на один символ
StrCmps $5 $char 0 +2 ;cравниваем символ учитывая регистр символа, это очень важно!
StrCpy $stroka_out $stroka_out$conv_char
${Next}
${LoopUntil} $0 == 256 ;глобальный цикл на 256 символов строки
;/////////////////////////////
Return
.whilefor_End:
;/////////////////////////////
DetailPrint "Входная строка: $stroka_in"
DetailPrint "Закодированная строка: $stroka_out"
SectionEnd
То что нужно, спасибо огромное.
kotkovets
29-09-2011, 14:46
Impeck,
Еще маленькая загвоздка, как известно NSIS хранит в переменной максимум 1024 символа
расширенная версия NSIS хранит максимум 8192 символа
(более подробно почитайте в справочнике по NSIS - > Расширенная версия NSIS
Так вот при конвертировании одного символа - конвертированный символ занимает 5 символов, при превышении максимального
хранения символов входной строки - будет обрезаться, т.е выходная строка будет обрезана до максимума хранения. ${NSIS_MAX_STRLEN}
Здесь очень выгодно использовать расширенную версию NSIS.
как правильно
SetShellVarContext all
CreateDirectory "$APPDATA\Adobe\"
SetShellVarContext all
CopyFiles /SILENT "$EXEDIR\Data\Adobe\*.*" "$APPDATA\Adobe\"
или
SetShellVarContext all
CreateDirectory "$APPDATA\Adobe\"
CopyFiles /SILENT "$EXEDIR\Data\Adobe\*.*" "$APPDATA\Adobe\"
?
kotkovets
29-09-2011, 22:19
как правильно »
Достаточно в один раз прописать в скрипте, чет вы не уверены, проверяйте, а потом вопрос задавайте...
wolkow70
02-10-2011, 14:58
Товарищи, есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7?
есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7 »
Переведи или объясни в какое место этой панели
wolkow70
02-10-2011, 15:35
Переведи или объясни в какое место этой панели »
Куда помещаются ярлыки программ, место можно крайнее справа...
В Inno примерно так пишется (подсмотел в скрипте):
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\PotPlayer"; Filename: "{app}\PotPlayerMini.exe"; WorkingDir: "{app}"; Check: "MakeQuickLaunchIcon"; BeforeInstall: "PinToTaskband ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\PotPlayer.lnk')"; MinVersion: 0.0,6.01;
kotkovets
02-10-2011, 16:09
есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7? »
http://forum.oszone.net/post-1307991-2.html
#помещаем ярлык к блокноту
Exec `wscript.exe PinToTasckbar.vbs "$WINDIR\notepad.exe"`
#если нужно удалить ярлык, запускаем еще раз
wolkow70
02-10-2011, 16:18
kotkovets,
Других вариантов нет, без VBS?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC