$ {ExeSourcePath} - это определение прекомпилятора, а $ ExeSourcePath - это переменная, используемая во время выполнения, команда File может использовать только определения прекомпилятора.
Существует два способа обработки этого:
A) Включите оба файла и решите во время выполнения, основываясь на пользовательской системе или выборе, сделанном во время установки:
!include LogicLib.nsh
Section
ReadRegStr $0 HKLM "Software\foo\bar" baz
${If} $0 > 5
File "c:\myproject\version2\app.exe"
${Else}
File "c:\myproject\version1\app.exe"
${EndIf}
SectionEnd
B) Включите только один файл на основе командной строки, переданной в makensis (/ Dusev2 app.nsi)или что-то в вашей системе:
Section
!define projectroot "c:\myproject"
!searchparse /noerrors /file ....... usev2 ;Or you can use !system etc
!ifdef usev2
File "${projectroot}\version2\app.exe"
!else
File "${projectroot}\version1\app.exe"
!endif
SectionEnd