Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Помогите написать скрипт, пожалуйста.
Есть такая задача:
Имеем папку с системными шрифтами 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
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} - сработает в любых случаях, кроме, когда нет флага ошибки..
В принципе так и стоит у меня в скрипте, просто я не скопировал...может дело в макросе установки ассоциация...не обрабатывается он в тихом режиме что ли...
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)
Чтобы сразу отбросить лишние вопросы:
Справку читал
В теме искал
В гугле тоже искал
Пример с 266 страницы глючный слегка. Не хватает команды StrCpy $FONT_DIR $FONTS
Но всё равно это не то. Там добавление НОВОГО шрифта
С установкой нового шрифта вообще НИКАКИХ проблем. Даже инсталляторы не нужны для этого дела. WinRAR SFX хватает с зашитым вызовом fontinst.exe.
Не могу обновить уже установленные шрифты. Вот и полез в NSIS за помощью. Ведь должен он уметь?
NSIS вижу впервые в жизни. Готовых примеров не нашел. Из справки и статей не понял как обновлять системные файлы.
Делал давно инсталлятор и сейчас понадобился такой же скрипт. Писать с нуля очень уж нудно, а старый скрипт уже потерялся, остался только созданный с его помощью инсталлятор.
Наверно очень глупый вопрос задам, не пинайте сильно :)
Можно ли как-то вытащить скрипт из скомпилированного файла?
silione,
Шапка темы\Ещё немного полезной информации: \читать дальше » ● Чем я могу распаковать инсталлятор, созданный в NSIS?
В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции.
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
бездумный копипаст..
Мож и заслепило..мож зациклился хз
Пробовал и класы менять
#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}
Спасибо! Теперь разобрался! Заработало!
kotkovets, читал в справке вашу статью Работа с процессами с помощью NSIS, но вот есть такая проблемка, и не нашел как реализовать, нада чтоб инсталлятор (в процесе установки) ждал запуска определенного exe-шника, и как только последний появится в процессах (запуститься) выполнял определенные действия с ним...что то типа ожидание запуска процесса но только не заданное время а до его фактического запуска.
Спасибо!
kotkovets
05-11-2012, 00:05
(в процесе установки) ждал запуска определенного exe-шника »
а смысл? может он никогда не запустится! .. :biggrin:
Sleep - конечно не устраивает, подбирай время..
а подумать? инструмент есть..
ну в цикл проверку назначить..
ну а сколько, нужно таких циклов, если вдруг (не дай боже) не заведется?
обратно, тоже самое блин..
читал в справке вашу статью Работа с процессами с помощью NSIS »
ну раз читали, то:
1. инструкцию ${ProcessExists} - закидываем в цикл..
2. определяем сколько нужно циклов проверки, если исполнитель не заведется.. 50 - 100 раз.
можно конечно и бесконечный цикл..
3. Условие выхода из цикла - найденный процесс..
а смысл? может он никогда не запустится! »
Смысл в том что при таком варианте:
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»
здесь тоже, перед этой командой нужна небольшая задержка..
пока кнопка прорисуется.., что бы не получить нулевой дескриптор кнопки..
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC