Run Command After Compilation

From NSIS Wiki
Jump to navigationJump to search
Author: Jeff Doozan (talk, contrib)


NSIS3 added the !finalize command that should be used as a replacement for this script.


Description

Include this script to run commands after build finishes. This can be useful for signing installers or other post-build events.

This has only been tested with Windows NT (NT/XP/Vista). It will probably not work on other systems.

Usage

Normal:

${PostExec1} PostBuild.bat

The number after "PostExec" is the number of arguments. If you need to call a program with additional arguments, be sure you use the correct PostExec#

${PostExec9} signtool.exe sign /f key.pfx /p pass /t http://timestamp.comodoca.com/authenticode installer.exe

Examples

Normal:

!include PostExec.nsh
 
!define OUTFILE "C:\MyApp.exe"
OutFile ${OUTFILE}
 
; sign the installer after it has been created
${PostExec2} sign.bat ${OUTFILE}

The Script

; ---------------------
;       PostExec.nsh
; ---------------------
;
; Windows NT only
; Macros for running programs after makensis has completed
;
; Created by Jeff Doozan
;
 
!ifndef POSTEXEC_NSH
!define POSTEXEC_NSH
 
!verbose push
!verbose 3
 
!define PostExec1  `!insertmacro _PostExec1`
!define PostExec2  `!insertmacro _PostExec2`
!define PostExec3  `!insertmacro _PostExec3`
!define PostExec4  `!insertmacro _PostExec4`
!define PostExec5  `!insertmacro _PostExec5`
!define PostExec6  `!insertmacro _PostExec6`
!define PostExec7  `!insertmacro _PostExec7`
!define PostExec8  `!insertmacro _PostExec8`
!define PostExec9  `!insertmacro _PostExec9`
 
!macro _PostExec1 pe1
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1}"
!macroend
 
!macro _PostExec2 pe1 pe2
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2}"
!macroend
 
!macro _PostExec3 pe1 pe2 pe3
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3}"
!macroend
 
!macro _PostExec4 pe1 pe2 pe3 pe4
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3} ${pe4}"
!macroend
 
!macro _PostExec5 pe1 pe2 pe3 pe4 pe5
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3} ${pe4} ${pe5}"
!macroend
 
!macro _PostExec6 pe1 pe2 pe3 pe4 pe5 pe6
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3} ${pe4} ${pe5} ${pe6}"
!macroend
 
!macro _PostExec7 pe1 pe2 pe3 pe4 pe5 pe6 pe7
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3} ${pe4} ${pe5} ${pe6} ${pe7}"
!macroend
 
!macro _PostExec8 pe1 pe2 pe3 pe4 pe5 pe6 pe7 pe8
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3} ${pe4} ${pe5} ${pe6} ${pe7} ${pe8}"
!macroend
 
!macro _PostExec9 pe1 pe2 pe3 pe4 pe5 pe6 pe7 pe8 pe9
  !tempfile FILE
  !delfile "${FILE}"
  !insertmacro _PostExecWriteBatFile "${FILE}.bat"
 
  # execute the batch file
  !system "${FILE} ${pe1} ${pe2} ${pe3} ${pe4} ${pe5} ${pe6} ${pe7} ${pe8} ${pe9}"
!macroend
 
 
 
!macro _PostExecWriteBatFile FILE
 
  !appendfile "${FILE}" '@ECHO OFF$\n'
  !appendfile "${FILE}" 'SETLOCAL$\n'
  !appendfile "${FILE}" '$\n'
  !appendfile "${FILE}" 'SET Command=%~1$\n'
  !appendfile "${FILE}" 'IF NOT "%1"=="DELAYED_LOAD" ($\n'
  !appendfile "${FILE}" '  :: Run this script again with "DELAYED_LOAD" as the first parameter$\n'
  !appendfile "${FILE}" '  :: this lets use break out of the original shell so that makensis will not wait for$\n'
  !appendfile "${FILE}" '  :: this script to finish$\n'
  !appendfile "${FILE}" '  start "" /D "%~dp0" "%COMSPEC%" /c "%~dpf0" DELAYED_LOAD %1 %2 %3 %4 %5 %6 %7 %8 %9$\n'
  !appendfile "${FILE}" '  EXIT /B$\n'
  !appendfile "${FILE}" ') $\n'
  !appendfile "${FILE}" '$\n'
  !appendfile "${FILE}" 'SHIFT$\n'
  !appendfile "${FILE}" 'SET PROCESS=makensis.exe$\n'
  !appendfile "${FILE}" 'echo Waiting for %PROCESS% to exit$\n'
  !appendfile "${FILE}" 'echo %1 %2 %3 %4 %5 %6 %7 %8 %9$\n'
  !appendfile "${FILE}" '$\n'
  !appendfile "${FILE}" ':: Get the PID of makensis.exe$\n'
  !appendfile "${FILE}" 'FOR /F "tokens=2 skip=3" %%i IN ($\n'
  !appendfile "${FILE}" '  $\'tasklist.exe /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "IMAGENAME eq %Process%"$\'$\n'
  !appendfile "${FILE}" ') DO ($\n'
  !appendfile "${FILE}" '  CALL :TASKWAIT %PROCESS% %%~i$\n'
  !appendfile "${FILE}" ')$\n'
  !appendfile "${FILE}" '$\n'
  !appendfile "${FILE}" '%1 %2 %3 %4 %5 %6 %7 %8 %9$\n'
  !appendfile "${FILE}" 'ENDLOCAL$\n'
  !appendfile "${FILE}" 'DEL %0.bat$\n'
  !appendfile "${FILE}" 'EXIT$\n'
  !appendfile "${FILE}" '$\n'
  !appendfile "${FILE}" '$\n'
  !appendfile "${FILE}" ':TASKWAIT$\n'
  !appendfile "${FILE}" '  ping.exe -n 2 -w 1000 127.0.0.1 >NUL$\n'
  !appendfile "${FILE}" '  tasklist.exe /FI "USERNAME eq %USERDOMAIN%\%USERNAME%" /FI "IMAGENAME eq %1" /FI "PID eq %2" 2>NUL | find.exe "%1" >NUL && GOTO %0$\n'
  !appendfile "${FILE}" '  EXIT /B$\n'
 
!macroend
 
!verbose pop
!endif