Некоторые журналы пропущены в журнале установки NSIS

#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. Опубликованный вами пример не компилируется. Также, пожалуйста, приведите пример без сторонних плагинов. Когда я перемещаю вещи, чтобы заставить их компилироваться и комментировать некоторые вещи, я не могу воспроизвести вашу проблему…