PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 [167] 168 169 170

unatlib
02-11-2012, 10:08
Помогите написать скрипт, пожалуйста.

Есть такая задача:

Имеем папку с системными шрифтами Arial, Calibri, Cambria, Consolas, Courier, Meiryo, Segoe UI, Tahoma, Times New Roman
Необходимо обновить их в системе.
Если в системе присутствует более свежая версия шрифта, то не заменять.
Почти все они заблокированы системой, поэтому замена должна быть с перезагрузкой компа
Если шрифта не было в системе, то корректно зарегистрировать его в реестре.

kotkovets
02-11-2012, 11:53
unatlib.org.ru,
http://nsis.sourceforge.net/Register_Fonts

diakov
02-11-2012, 13:44
kotkovets, почему при реализации такого варианта установки ассоциаций (как я писал выше) и такого варианта тихой установки:

${GetOptions} "$CMDLINE" "/port" $R0
${If} ${Silent} ;если тихий режим
${IfNot} ${Errors}
StrCpy "$INSTDIR" "$EXEDIR\KMPlayer Portable"
;тут пишем все команды при распаковки портативной версии
;здесь будет код выполняться с ключом /port в тихом режиме
StrCpy $Radio1 1 ;распаковка портативной версии
StrCpy $Radio 0 ;запрет установки в обычном режиме
${Else}
${GetOptions} "$CMDLINE" "/inst" $R0
SetOutPath "$INSTDIR"
StrCpy $Radio1 0 ;запрет портативной версии
StrCpy $Radio 1 ;установка в обычном режиме
StrCpy $Check 1; асоц видео
StrCpy $Check1 1 асоц аудио
StrCpy $Check2 1 и т.д.
StrCpy $Check3 1
StrCpy $Check4 1
StrCpy $Check5 1
StrCpy $Check6 1
StrCpy $Check7 1
ClearErrors
${EndIf}


В тихом режиме ассоциации не устанавливаются, а в обычном все ок...

kotkovets
02-11-2012, 14:49
пробуйте так:
ClearErrors
${GetOptions} "$CMDLINE" "/port" $R0
${IfNot} ${Errors}
Меssagebox mb_ок 'х.з'
---
---
инструкция - ${IfNot} ${Errors} - сработает, когда нет флага ошибки..
инструкция - ${Else} - сработает в любых случаях, кроме, когда нет флага ошибки..

diakov
02-11-2012, 15:07
В принципе так и стоит у меня в скрипте, просто я не скопировал...может дело в макросе установки ассоциация...не обрабатывается он в тихом режиме что ли...

unatlib
02-11-2012, 16:07
http://nsis.sourceforge.net/Register_Fonts »
Попробовал
!include FontReg.nsh
!include FontName.nsh
!include WinMessages.nsh

!define APPNAME "Обновление шрифтов"
!define APPNAMEANDVERSION "Обновление шрифтов 1.0"

Name "${APPNAMEANDVERSION}"
OutFile "OutFile.exe"

!include "MUI.nsh"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd


Section "Fonts"
StrCpy $FONT_DIR $FONTS
!insertmacro InstallTTFFont 'ARIAL.TTF'
SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000
SectionEnd


Не работает :( Вижу прогресс бар копирования файла, но ничего на самом деле не копируется.

kotkovets
02-11-2012, 16:39
Попробовал »
а в теме поискать? конечно это не совсем точно, но тем не менее..
266 (http://forum.oszone.net/showthread.php?t=67386&page=266&highlight=%F8%F0%E8%F4%F2%FB)

unatlib
02-11-2012, 17:06
Чтобы сразу отбросить лишние вопросы:

Справку читал
В теме искал
В гугле тоже искал


Пример с 266 страницы глючный слегка. Не хватает команды StrCpy $FONT_DIR $FONTS
Но всё равно это не то. Там добавление НОВОГО шрифта
С установкой нового шрифта вообще НИКАКИХ проблем. Даже инсталляторы не нужны для этого дела. WinRAR SFX хватает с зашитым вызовом fontinst.exe.

Не могу обновить уже установленные шрифты. Вот и полез в NSIS за помощью. Ведь должен он уметь?
NSIS вижу впервые в жизни. Готовых примеров не нашел. Из справки и статей не понял как обновлять системные файлы.

silione
04-11-2012, 02:03
Делал давно инсталлятор и сейчас понадобился такой же скрипт. Писать с нуля очень уж нудно, а старый скрипт уже потерялся, остался только созданный с его помощью инсталлятор.

Наверно очень глупый вопрос задам, не пинайте сильно :)

Можно ли как-то вытащить скрипт из скомпилированного файла?

MKN
04-11-2012, 10:58
silione,
Шапка темы\Ещё немного полезной информации: \читать дальше » ● Чем я могу распаковать инсталлятор, созданный в NSIS?
В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции.

diakov
04-11-2012, 15:30
kotkovets, подскажи хочу сэумулировать нажатие кнопки Активировать активатора:

Exec "$PLUGINSDIR\keygen.exe"
Sleep 1500
FindWindow $0 '#32770' 'AMS Software "ФотоШОУ v4.0"'
IsWindow $0 +2 0
MessageBox MB_OK|MB_ICONSTOP "Указанное окно не найдено" idOK error
GetDlgItem $1 $0 7
; Получаем дескриптор кнопки "Далее"
MessageBox MB_OK|MB_ICONINFORMATION "После нажатия на кнопку ОК будет нажата кнопка 'Далее'"
SendMessage $1 ${BM_CLICK} 0 0
; Нажимаем кнопку
error:
${EndIf}


Инфа аутоита о бутоне такая
http://i.piccy.info/i7/73052b204b4979a7f5463f3ece08caa1/4-48-144/13666541/2012_11_04_132829.png

Как только не пробовал пишет Указанное окно не найдено

kotkovets
04-11-2012, 16:14
Инфа аутоита о бутоне такая »
Ну так в чем дело или заслепило..
про класс главного окна..
FindWindow $0 '#32770' 'AMS Software "ФотоШОУ v4.0"'
класс же четко прописан: Autoit v3 GUI
где тут: #32770 ?????????
---
p.s
бездумный копипаст..

diakov
04-11-2012, 16:24
Мож и заслепило..мож зациклился хз
Пробовал и класы менять
#32768 The class for a menu.
#32769 The class for the desktop window.
#32770 The class for a dialog box.
#32771 The class for the task switch window.
#32772 The class for icon titles.

И вместо класа ставить FindWindow $0 'Autoit v3 GUI' 'AMS Software "ФотоШОУ v4.0"' не работает все также Указанное окно не найдено! Так в чем же дело?

kotkovets
04-11-2012, 16:32
И вместо класа ставить FindWindow $0 'Autoit v3 GUI' 'AMS Software "ФотоШОУ v4.0"' не работает все также Указанное окно не найдено! Так в чем же дело? »
Все работает..
не надо ля..ля .. :)
Exec "$EXEDIR\Au3Info.exe"
Sleep 1000
FindWindow $0 "Au3Info" "(Frozen) AutoIt v3 Window Info" ;находим дескриптор окна
${Unless} $0 == 0
${NSD_GetText} $0 $1
MessageBox MB_OK "дескриптор окна: $0$\ntitle: $1" IDOK

${Else}
MessageBox MB_OK "каюк, нет стеклопакета.." IDOK
${EndUnless}

diakov
04-11-2012, 16:36
Спасибо! Теперь разобрался! Заработало!

diakov
04-11-2012, 22:03
kotkovets, читал в справке вашу статью Работа с процессами с помощью NSIS, но вот есть такая проблемка, и не нашел как реализовать, нада чтоб инсталлятор (в процесе установки) ждал запуска определенного exe-шника, и как только последний появится в процессах (запуститься) выполнял определенные действия с ним...что то типа ожидание запуска процесса но только не заданное время а до его фактического запуска.
Спасибо!

kotkovets
05-11-2012, 00:05
(в процесе установки) ждал запуска определенного exe-шника »
а смысл? может он никогда не запустится! .. :biggrin:
Sleep - конечно не устраивает, подбирай время..
а подумать? инструмент есть..
ну в цикл проверку назначить..
ну а сколько, нужно таких циклов, если вдруг (не дай боже) не заведется?
обратно, тоже самое блин..
читал в справке вашу статью Работа с процессами с помощью NSIS »
ну раз читали, то:
1. инструкцию ${ProcessExists} - закидываем в цикл..
2. определяем сколько нужно циклов проверки, если исполнитель не заведется.. 50 - 100 раз.
можно конечно и бесконечный цикл..
3. Условие выхода из цикла - найденный процесс..

diakov
05-11-2012, 00:11
а смысл? может он никогда не запустится! »
Смысл в том что при таком варианте:


Exec "$PLUGINSDIR\keygen.exe"
Sleep 2500
FindWindow $0 "AutoIt v3 GUI" ""
StrCmp $0 "0" +3 0
MessageBox MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_OK "Генератор активации запущен!$\n Для активации ФотоШОУ 4.0 нажмите ОК!"
Goto +4
MessageBox MB_RETRYCANCEL|MB_SETFOREGROUND "Генератор активации не запущен! Нажмите кнопку ПОВТОР!" IDRETRY +2
Abort
Goto -6
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
MessageBox MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_OK "Активация завершена!"
${KillProcess} "keygen.exe" $4

Медленные компы почему то запускают позже этот самый keygen.exe...и соответственно если увеличить Sleep то на нормальных машинах keygen.exe запускается раньше и ревет музыка что дико напрягает, вот что бы было ожидание запуск и сразу эмуляция нажатие тогда было бы лучше....Или мож как то другим боком выйти из ситуации?

То есть Вы имеете ввиду что можно как то так:

${If} ${ProcessExists} "keygen.exe"
Sleep 1000
FindWindow $0 "AutoIt v3 GUI" ""
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
${KillProcess} "keygen.exe" $4
${Else}
Sleep 1000
${EndIf}
${If} ${ProcessExists} "keygen.exe"
Sleep 1000
FindWindow $0 "AutoIt v3 GUI" ""
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
${KillProcess} "keygen.exe" $4
${Else}
Sleep 1000
${EndIf}
${If} ${ProcessExists} "keygen.exe"
Sleep 1000
FindWindow $0 "AutoIt v3 GUI" ""
GetDlgItem $1 $0 7
SendMessage $1 ${BM_CLICK} 0 0
${KillProcess} "keygen.exe" $4
${Else}
Sleep 1000
${EndIf}

kotkovets
05-11-2012, 00:35
Медленные компы почему то запускают позже этот самый keygen.exe...и соответственно если увеличить Sleep то на нормальных машинах keygen.exe запускается раньше и ревет музыка что дико напрягает, вот что бы было ожидание запуск и сразу эмуляция нажатие тогда было бы лучше....Или мож как то другим боком выйти из ситуации? »
!include "ProcessFunc.nsh"
Exec "$EXEDIR\Au3Info.exe"
StrCpy $1 0
${Do}
Sleep 150
Intop $1 $1 + 1
${If} ${ProcessExists} "Au3Info.exe"
StrCpy $1 1
${Break}
${EndIf}
${LoopUntil} $1 > 20 ;20 раз проверяем процесс

${If} $1 == 1
FindWindow $0 "Au3Info" "(Frozen) AutoIt v3 Window Info"
${Unless} $0 == 0
MessageBox MB_OK "есть окно" IDOK
${Else}
MessageBox MB_OK "нет окна" IDOK
${EndUnless}
${EndIf}
GetDlgItem $1 $0 7»
здесь тоже, перед этой командой нужна небольшая задержка..
пока кнопка прорисуется.., что бы не получить нулевой дескриптор кнопки..

diakov
05-11-2012, 00:41
Спасибо буду пробовать!




© OSzone.net 2001-2012