Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
06-12-2011, 16:55
Товарищи, как удалить папку, если она пустая? Чего-то не нашел.
wolkow70
06-12-2011, 17:34
Сам нашел такой вариант:
StrCpy $0 "$PROGRAMFILES\FinalWire"
Call un.DeleteDirIfEmpty
Function un.DeleteDirIfEmpty
FindFirst $R0 $R1 "$0\*.*"
strcmp $R1 "." 0 NoDelete
FindNext $R0 $R1
strcmp $R1 ".." 0 NoDelete
ClearErrors
FindNext $R0 $R1
IfErrors 0 NoDelete
FindClose $R0
Sleep 1000
RMDir "$0"
NoDelete:
FindClose $R0
FunctionEnd
kotkovets
06-12-2011, 18:20
Товарищи, как удалить папку, если она пустая »
Сам нашел такой вариант:
StrCpy $0 "$PROGRAMFILES\FinalWire"
Call un.DeleteDirIfEmpty »
Чет сложновато, Вот это вариант:
OutFile "emptydir.exe"
Section
System::Call "Shlwapi::PathIsDirectoryEmpty(t'$PROGRAMFILES\FinalWire')i.r0"
StrCmp $0 1 0 +2
RmDir "$PROGRAMFILES\FinalWire"
SectionEnd
wolkow70
06-12-2011, 18:39
Чет сложновато, Вот это вариант: »
Тут я понимаю, задействуется системная функция, а тот вариант чисто NSIS. Впрочем оба работают.
kotkovets
06-12-2011, 18:42
wolkow70, WinAPI - четко и быстро, чем рекурсивно перебирать файлы, медленно!
Вот макрос сварганил для удобства:
!define RmEmptyDir "!insertmacro PathIsDirectoryEmpty"
!macro PathIsDirectoryEmpty Dir
Push `${Dir}`
System::Store S
System::Call "Shlwapi::PathIsDirectoryEmpty(tsR1)i.R0"
StrCmp $R0 1 0 +2
RmDir `$R1`
System::Store L
!macroend
запуск:
${RmEmptyDir} "Путь к папке"
Подскажите, пожалуйста, как можно подписать EXE-файл после компиляции. В сети натыкался на неработающие варианты:
${PostExec2} sign.bat ${OUTFILE}
!finalize 'sign.bat "%1"'
Если делать !system или !execute, то где их не размещай, они будут выполняться до завершения компиляции. Неужели только городить с самовызовом или через внешний bat-файл?
P.S. Выяснил, что !finalize это относительно новая опция, в последнем релизе её нет. Но использовать нестабильные бета-версии нежелательно на проекте. Кстати, кто-то знает, NSIS вообще поддерживается еще или проект умер и лучше MSI использовать?
kotkovets
06-12-2011, 21:04
Подскажите, пожалуйста, как можно подписать EXE-файл после компиляции »
http://nsis.sourceforge.net/Run_Command_After_Compilation
${PostExec*} - пишется последней командой в скрипте.
Если вкратце - для подписи файлов нужны:
SignTool
.NET Framework Tools
Sign Tool (SignTool.exe)
http://msdn.microsoft.com/en-us/library/8s9b9yaz(VS.80).aspx
The Sign Tool is a command-line tool that digitally signs files, verifies signatures in files, or time stamps files.
The command demonstrates how to sign a file automatically using the best certificate.
signtool sign /a MyFile.exe и сертификат
Если честно, этим делом муторным не занимался, посему деталей я не знаю
Alexey_KF
06-12-2011, 21:54
Пытаюсь написать скрипт (на выходе должен получиться Updates ESET.exe, в котором содержится папка с антивирусными базами eset_upd и файл лицензии eset.lic)
Updates ESET.exe - при запуске должен извлеч папку eset_upd по пути $PROGRAMFILES\ESET и извлеч файл eset.lic по пути $PROGRAMFILES\ESET\ESET NOD32 Antivirus\License
начал писать скрипт и застрял. Прошу помощи.
Начало скрипта:
!define version "4хх/5хх"
!define text "Создание...$\n"
!addplugindir ".\"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Alexey_KF"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "FileDescription" "Updates ESET"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
XPStyle on
Name "Updates ESET"
SubCaption 3 " "
ShowInstDetails nevershow
Icon install.ico
OutFile "Updates ESET.exe"
kotkovets
06-12-2011, 22:01
начал писать скрипт и застрял. Прошу помощи »
А где вы застряли? :lazy:
Alexey_KF
06-12-2011, 22:22
вот где и застрял:
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "UpdatesESET") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_TOPMOST|MB_ICONINFORMATION "Updates ESET уже запущен..."
Quit
messagebox::show MB_DEFBUTTON3|MB_TOPMOST "Установка антивирусных баз ESET 4хх/5хх" "Установить" "Отмена"
Quit
start:
IfFileExists "$PROGRAMFILES\ESET\ESET NOD32 Antivirus\License\*.lic" 0 +2
kotkovets
06-12-2011, 22:55
Пользователь нажимает "Установить" и начинается извлечение файлов.. »
Читайте больше справочных материалов - на пользу только вам!
MessageBox MB_ICONQUESTION|MB_YESNO "Установить NOD_UPD ?" IDYES +2
Abort ;прерывание установки при нажатии кнопки "нет"
SetOutPath "$PROGRAMFILES\ESET"
File /r "eset_upd"
IfFileExists "$EXEDIR\eset.lic" 0 +2 ;если рядом с установщиком есть eset.lic, то
CopyFiles /SILENT "$EXEDIR\eset.lic" "$PROGRAMFILES\ESET\ESET NOD32 Antivirus\License" ;копируем файл куда указали
Цитата dron008:
Подскажите, пожалуйста, как можно подписать EXE-файл после компиляции »
http://nsis.sourceforge.net/Run_Comm...er_Compilation
${PostExec*} - пишется последней командой в скрипте.
С самой подпиской-то проблем никаких, сертификат имеется. Надо просто вызвать другую программу после создания EXE-файла уже, передавая его как параметр. Вариант с ${PostExec*} пробовал. Во-первых он не заработал, а детальнее не разбирался, во-вторых не нравится, что зависит от кучи системных вещей, наличия команд - неуниверсальное решение и громоздкое какое-то.
В общем, пришлось выносить эту команду из инсталлятора, пока в bat-файл, потом в ANT-скрипт. Но несколько разочарован развитием NSIS'а.
Alexey_KF
07-12-2011, 20:42
Запускаю истолятор и он мне выдает ошибку с тектом Error opening file for writing: \eset_upd\nod12E.nup
Где ошибка в скрипте?
!define version "5.0.0.0"
!define text "Идёт подготовка...$\n"
!addplugindir ".\"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Alexey_KF"
VIAddVersionKey /LANG=1049 "CompanyName" "Alexey_KF"
VIAddVersionKey /LANG=1049 "FileDescription" "Updates ESET"
VIAddVersionKey /LANG=1049 "FileVersion" "${version}"
VIProductVersion "${version}"
SetCompressor /SOLID lzma
XPStyle on
Name "Updates ESET"
SubCaption 3 " "
ShowInstDetails nevershow
Icon install.ico
OutFile "Updates ESET.exe"
Section
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2
File eset.lic
SectionEnd
Function .onInit
MessageBox MB_ICONQUESTION|MB_YESNO "Установить Антивирусные базы ?" IDYES +2
Abort ;прерывание установки при нажатии кнопки "нет"
FunctionEnd
Section
SetOutPath "$PROGRAMFILES64\ESET"
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2 ;если рядом с установщиком есть eset.lic, то
CopyFiles /SILENT "$EXEDIR\eset.lic" "$PROGRAMFILES64\ESET\ESET NOD32 Antivirus\License"
SectionEnd
kotkovets
07-12-2011, 20:46
Где ошибка в скрипте? »
Section
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2
File eset.lic
SectionEnd
Что здесь за бред?
Трудно, что ли в справке почитать: » File: Добавляем файлы в инсталлятор
Alexey_KF
07-12-2011, 22:24
Справка у меня открыта перед носом, а еще смотрю на примеры скриптов... Если не сложно то помогите
kotkovets
07-12-2011, 22:44
Если не сложно то помогите »
Да мне то не сложно, то, вы читаете и непонимаете.. и не поймете.
Я писал это бред, так уберите этот бред в скрипте.
Section
File /r "eset_upd*"
IfFileExists "$EXEDIR\eset.lic" 0 +2
File eset.lic
SectionEnd
SetOutPath "путь распаковки"
File file.dat
Команда SetOutPath указывает путь распаковки файла file.dat и путь распаковки записывает в переменную $OUTDIR
В данном примере файл file.dat должен находится в одной папке со скриптом. Если мы хотим добавить файл(ы) с иного места, то пишем:
File "C:\Install\file.dat"
В этом примере файл добавиться в установщик из каталога C:\Install
Если нужно добавить все файлы, включая вложенные папки, добавляем параметр /r (рекурсивно)
При этом сохраняется вся структура вложенных папок в каталоге
File /r "C:\Install"
Что здесь сверхсложного?
kotkovets,
Будет ли работать в x64 ОС команда :
ExecWait "rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 myInf.inf" ?
kotkovets
10-12-2011, 11:45
MKN,
Какие то то сомнения в x64 ? откуда?
При правильном подходе все работает!
wolkow70
10-12-2011, 15:29
kotkovets,
Не подскажите решение такой задачки?
Скрипт установки у меня создает папку с резервными копиями файлов настроек "$DOCUMENTS\Opera Backup".
Если повторно переустанавливать (устанавливать) программу опять будет создана резевная папка.
Можно, конечно проверить наличие и перименовать старую папку в Opera Backup_old1 или того рода.
Но как сделать, чтобы каждый раз ранее созданная папка Opera Backup автоматически переимеовывалась с новым именем (например, привязанным к дате и времени переименования или порядковым номером). Ну, короче, что бы не происходило наслоения.
kotkovets
10-12-2011, 17:46
Но как сделать, чтобы каждый раз ранее созданная папка Opera Backup автоматически переимеовывалась с новым именем »
Элементарно, вариант на счетчике:
${If} ${FileExists} "$EXEDIR\Opera Backup"
StrCpy $2 0 ;иницилизируем счетчик в нуль
FindFirst $0 `$1` "$EXEDIR\Opera Backup*" ;поиск по маске Opera Backup
${Do}
IntOp $2 $2 + 1 ;счетчик папок начинающийся с названия Opera Backup
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0 ;закрываем поиск
${If} $2 != 0
Rename "$EXEDIR\Opera Backup" "$EXEDIR\Opera Backup_old$2" ;переименовываем предыдущую папку "Opera Backup"
CreateDirectory "$EXEDIR\Opera Backup" ;создаем новую папку "Opera Backup"
${EndIf}
${Else}
CreateDirectory "$EXEDIR\Opera Backup"
${EndIf}
вариант на макросе GetTime
!include "filefunc.nsh"
OutFile "setup.exe"
var time_backup
Section
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
StrCpy $time_backup "$0.$1.$2[$4.$5.$6]"
CreateDirectory "$EXEDIR\Opera Backup_$time_backup"
SectionEnd
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC