File
- это гибридная функция, которая выполняется как во время компиляции, так и во время выполнения!
Вы не можете использовать переменные с инструкцией File
, только определяет:
!define srcdir "c:\myfiles"
OutFile Test.exe
Page Directory
Page InstFiles
Section
SetOutPath $InstDir
File /r "${srcdir}\*.*"
SectionEnd
Переменные раскрываются, когда установщик работает на компьютере конечного пользователя, но компилятору необходимо знать пути к файлам при сжатии файлов на локальном компьютере.
Если вы хотите сделать что-то особенное, то вам необходимоиспользуйте !system
для запуска внешнего инструмента / скрипта, который генерирует нужные вам инструкции, которые вы можете !include
:
InstallDir $Temp\InstTest
Page Directory
Page InstFiles
; Build dummy directory tree for this example:
!system 'md %temp%\test\1\2\3\4'
!system 'md %temp%\test\a\b'
!appendfile '$%temp%\test\a\file.txt' "Hello$\n"
; Build batch file
!appendfile "$%temp%\nsistmp.cmd" '@ECHO OFF&SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION$\r$\n'
!appendfile "$%temp%\nsistmp.cmd" 'SET nsh=%~1&SET dst=%~2&GOTO s$\r$\n'
!appendfile "$%temp%\nsistmp.cmd" ':enum$\r$\n'
!appendfile "$%temp%\nsistmp.cmd" 'FOR /D %%A IN ("%~1\%~2\*") DO ((>> "%nsh%" ECHO CreateDirectory "%dst%\%~2\%%~nA") & CALL %0 "%~1" "%~2\%%~nA")$\r$\n'
!appendfile "$%temp%\nsistmp.cmd" '@GOTO :EOF$\r$\n'
!appendfile "$%temp%\nsistmp.cmd" ':s$\r$\n'
!appendfile "$%temp%\nsistmp.cmd" 'CALL :enum "%~3" "."$\r$\n'
; Execute batch and include the result:
Section
SetOutPath $InstDir
!tempfile nsh
!system '"$%temp%\nsistmp.cmd" "${nsh}" $InstDir "%temp%\test"'
!delfile "$%temp%\nsistmp.cmd"
!include "${nsh}"
!delfile "${nsh}"
SectionEnd