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

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} "Путь к папке"

dron008
06-12-2011, 19:49
Подскажите, пожалуйста, как можно подписать 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
07-12-2011, 15:52
Цитата 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"

Что здесь сверхсложного?

MKN
10-12-2011, 10:55
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