#logging #installation #nsis
#ведение журнала #установка #nsis
Вопрос:
Я использую специальную сборку NSIS, которая поддерживает журналы установки. Это работает нормально, но в некоторых случаях журналы частично сохраняются для одного раздела. Это означает, что некоторые журналы пропущены. Я не уверен, что может быть причиной этой проблемы. Если NSIS архивирует файлы журналов, если они превышают размер? Что произойдет, если во время установки возникнут некоторые ошибки или исключения (например, блокировка некоторых exe-файлов антивирусом)?
Вот структура сценария установки:
!include "FileFunc.nsh"
!include "WinMessages.nsh"
!include "x64.nsh"
!include "WinVer.nsh"
!include "WordFunc.nsh"
!include "LogicLib.nsh"
RequestExecutionLevel admin
ShowInstDetails nevershow
ShowUninstDetails nevershow
AutoCloseWindow true
SetCompressor lzma
;major, minor, date, build
!define VERSION "1.0.0.1"
;Project name and version
!define PROJECT "Project1"
!define CONFIG_NAME "Config1"
!define SERVICE_NAME "Service01"
!define PROCESS_EXE "Process01.exe"
!define GUI_EXE "MainUI.exe"
!define COMMONDRIVER_EXE "ComDriver_v1.0.0.0.exe"
!define DEVICEDRIVER_EXE "DeviceDriver_v1.0.0.0.exe"
!define UNINSTALL_EXE "Uninstall.exe"
Name "${PROJECT}"
OutFile "${PROJECT}_Setup_v${VERSION}.exe"
!macro Cleanup
RMDir /r "$APPDATACompanyProductServiceFolder01"
RMDir /r "$INSTDIRWPFUI"
SetRegView 32
DeleteRegKey HKLM "SOFTWARECompanyProduct${PROJECT}"
!macroend
!macro WriteRegInfo
SetRegView 32
WriteRegStr HKLM "SOFTWARECompanyProduct${PROJECT}" "ProductVersion" "${VERSION}"
WriteRegStr HKLM "SOFTWARECompanyProduct${PROJECT}" "InstallDir" "$INSTDIR"
WriteRegStr HKLM "SOFTWARECompanyProduct${PROJECT}" "UninstallPath" "$WINDIR${UNINSTALL_UTILITY}"
WriteRegStr HKLM "SOFTWARECompanyProduct${PROJECT}" "UninstallerPath" "$APPDATACompanyProductUninstall${PROJECT}${PROJECT}_${UNINSTALL_EXE}"
!macroend
;install init
Function .onInit
!cd "....NSISBuild"
SetShellVarContext all
!insertmacro InitInstallDir
;UI has no staging folder.
!insertmacro WaitForGUI
!insertmacro StopServices
;copy prerequisites to temporary folder
InitPluginsDir
SetOutPath "$PLUGINSDIR"
File "......driverInstallerRzCom${COMMONDRIVER_EXE}"
File "......driverIinstaller${DEVICEDRIVER_EXE}"
FunctionEnd
Section "install-commondriver"
ExecWait '"$PLUGINSDIR${COMMONDRIVER_EXE}" /S' $0
${If} $0 != 0
SetErrorLevel $0
${EndIf}
SectionEnd
Section "install-devicedriver"
ExecWait '"$PLUGINSDIR${DEVICEDRIVER_EXE}" /S' $0
${If} $0 != 0
SetErrorLevel $0
${EndIf}
ExecWait '"$PLUGINSDIR${MIDDLEWARE_EXE}" /S' $0
SectionEnd
Section "install"
!insertmacro Cleanup
SetOutPath "$APPDATACompanyProductFolder01"
File /r ".DevicesDefaults${PID}"
SetOutPath "$INSTDIRWPFUI"
File /r ".UICompany.UI"
!cd "${__FILEDIR__}"
;send signed uinstaller
SetOutPath "$APPDATACompanyProductUninstall${PROJECT}"
File "${PROJECT}_${UNINSTALL_EXE}"
!insertmacro WriteRegInfo
${If} $ISLASTMODULE != "FALSE"
!insertmacro StartServices
${EndIf}
SectionEnd
;--------------------------------
!macro InitInstallDir
;prioritize registry
SetRegView 32
${GetParameters} $0
StrCpy $INSTDIR ""
${GetOptions} "$0" "/LWIDIR=" $INSTDIR
${If} $INSTDIR != ""
StrCpy $INSTDIR "$INSTDIRProduct"
${Else}
ReadRegStr $INSTDIR HKLM "SOFTWARECompanyProductProduct01" "InstallDir"
${EndIf}
${If} $INSTDIR == ""
StrCpy $INSTDIR "$PROGRAMFILES32CompanyProduct"
${EndIf}
StrCpy $ISLASTMODULE "TRUE"
${GetOptions} "$0" "/ISLASTMODULE=" $ISLASTMODULE
${If} $ISLASTMODULE != ""
${StrFilter} "$ISLASTMODULE" " " "" "" $ISLASTMODULE
${Else}
StrCpy $ISLASTMODULE "TRUE"
${EndIf}
!insertmacro EnableLogsWithHeader
!macroend
!macro EnableLogsWithHeader
; Get the date and time
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
; Turn on logging. This command must be after $INSTDIR
LogSet On
; Log the date and time
LogText "/******************* $0/$1/$2 ($3) $4:$5:$6 *******************/"
!macroend
!macro StopServices
SimpleSC::ExistsService "${SERVICE_NAME}"
Pop $0
${If} $0 == 0
SimpleSC::StopService "${SERVICE_NAME}" 1 30
!insertmacro WaitForSynapseService
!insertmacro WaitForProcess
${EndIf}
!macroend
!macro WaitForService
StrCpy $COUNTER "0"
${Do}
${nsProcess::FindProcess} "${SERVICE_EXE}" $R0
${If} $R0 == 0
Sleep 3000
IntOp $COUNTER $COUNTER 1
${Else}
${Break}
${EndIf}
${If} $COUNTER >= 10
${nsProcess::KillProcess} "${SERVICE_EXE}" $R0
${EndIf}
${Loop}
!macroend
!macro WaitForProcess
StrCpy $COUNTER "0"
${Do}
${nsProcess::FindProcess} "${PROCESS_EXE}" $R0
${If} $R0 == 0
${nsProcess::KillProcess} "${PROCESS_EXE}" $R0
Sleep 1000
IntOp $COUNTER $COUNTER 1
${Else}
${Break}
${EndIf}
${If} $COUNTER >= 3
${Break}
${EndIf}
${Loop}
!macroend
!macro WaitForGUI
StrCpy $COUNTER "0"
${Do}
${nsProcess::FindProcess} "${GUI_EXE}" $R0
${If} $R0 == 0
${nsProcess::KillProcess} "${GUI_EXE}" $R0
Sleep 1000
IntOp $COUNTER $COUNTER 1
${Else}
${Break}
${EndIf}
${If} $COUNTER >= 3
${Break}
${EndIf}
${Loop}
!macroend
!macro StopServices
SimpleSC::ExistsService "${SERVICE_NAME}"
Pop $0
${If} $0 == 0
SimpleSC::StopService "${SERVICE_NAME}" 1 30
!insertmacro WaitForService
!insertmacro WaitForProcess
${EndIf}
!macroend
Это усеченный пример install.log, мои журналы начинаются с пропущенного заголовка даты / времени.
CreateDirectory: "C:ProgramDataCompanyProductUninstallProduct01" (1)
CreateDirectory: "C:ProgramDataCompanyProductUninstallProduct01" created
File: overwriteflag=0, allowskipfilesflag=2, name="Product01_Uninstall.exe"
File: wrote 50072 to "C:ProgramDataCompanyProductUninstallProduct01Product01_Uninstall.exe"
SetFlag: 12=0
WriteRegStr: "HKEY_LOCAL_MACHINESOFTWARECompanyProductProduct01" "ProductVersion"="3.5.1215.120103"
WriteRegStr: "HKEY_LOCAL_MACHINESOFTWARECompanyProductProduct01" "InstallDir"="C:Program Files (x86)CompanyProduct"
WriteRegStr: "HKEY_LOCAL_MACHINESOFTWARECompanyProductProduct01" "UninstallPath"="C:WindowsInstallerUninstaller.exe"
WriteRegStr: "HKEY_LOCAL_MACHINESOFTWARECompanyProductProduct01" "UninstallerPath"="C:ProgramDataCompanyProductUninstallProduct01Product01_Uninstall.exe"
Delete: DeleteFile("C:WindowsTEMPnswCEA7.tmpnsProcess.dll")
Delete: DeleteFile on Reboot("C:WindowsTEMPnswCEA7.tmpnsProcess.dll")
Delete: DeleteFile("C:WindowsTEMPnswCEA7.tmpPID0085Drv_v0.1.0.0.exe")
Delete: DeleteFile("C:WindowsTEMPnswCEA7.tmpComDriver_v1.0.0.0.exe")
Delete: DeleteFile("C:WindowsTEMPnswCEA7.tmpSimpleSC.dll")
Delete: DeleteFile("C:WindowsTEMPnswCEA7.tmpSystem.dll")
RMDir: RemoveDirectory("C:WindowsTEMPnswCEA7.tmp")
RMDir: RemoveDirectory on Reboot("C:WindowsTEMPnswCEA7.tmp")
Комментарии:
1. Я не думаю, что существует ограничение на размер журнала, а если и есть, то не менее 2 ГБ.
2. Я также считаю, что это не является основной причиной этой проблемы. Но были некоторые отзывы, возможно, внутри NSIS есть некоторые ограничения по размеру. Я не проверял их исходный код. Очень странно, почему журналы отображаются в середине раздела.
3. Опубликуйте минимальный пример с проблемой, на которую я мог бы взглянуть.
4. Я обновил на примере.
5. Опубликованный вами пример не компилируется. Также, пожалуйста, приведите пример без сторонних плагинов. Когда я перемещаю вещи, чтобы заставить их компилироваться и комментировать некоторые вещи, я не могу воспроизвести вашу проблему…