Nsis: File commmand не может найти файл, когда путь содержит переменную - PullRequest
0 голосов
/ 13 декабря 2018

Вот мой код !define InputDir "D:\a" !define OutDir "D:\Temp2" StrCpy $R0 "T1" SetOutPath "${OutDir}\$R0" File /r "${InputDir}\$R0\*.*" В "D: \ a" есть две директории T1 T2. И в директории T1 находятся файлы.Но когда я запустил его, он показал, что «Файл: D: \ a \ $ R0 *. * -> файлы не найдены» Очевидно, команда не может найти переменную. Если есть какой-либо способ получить файлы, когда я просто знаювар, которые содержат имя директора?Благодарю.

и чем

1 Ответ

0 голосов
/ 13 декабря 2018

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
...