Уважаемые, возможно ли сделать так что бы установщик переименовал сам себя? Например был файл скомпилированный в nsis file.exe после запуска он в той же директории переименовал себя в file1.exe и продолжал выполнять постановленные задачи?
Ну или как реализовать альтернативный вариант (более закрученый): установщик запущенный из одной директории, путь его расположения помещается в переменную, установщик копирует себя в папку скажем темп, по старому пути удаляется и продолжает выполнять задания по пути из переменной.
Вроде последовательность действий сами описали, неужели код получится сложный? Пара команд...Тем более, что описание данных команд есть в справочнике. Опять же, если бы все прочли справочник "от корки до корки" и знали бы, какими командами могли воспользоваться, то такие посты бы не появлялись...
1. Переименовать файл активного процесса нельзя
Соответственно, нам нужен внешний EXE, который этим займётся
Создаём простой EXE, данный файл будет распаковываться в вашем основном инсталляторе, ваш инсталлятор передаст свой полный путь и при запуске EXE считает его через параметры, затем переименует файл и перезапустит инсталлятор (зачем вам вообще такие извращения?).
Код, который нужно добавить в код основного кода пакета инсталлятора:
Код:
Код: Выделить всё
!include "FileFunc.nsh"
Name "test"
OutFile "setup.exe"
InstallDir "$TEMP"
Function .onInit
call InstallerRenameFunc
FunctionEnd
Function InstallerRenameFunc
var /global CommandLine
${GetExeName} $R0
${GetParameters} $CommandLine
${GetOptions} "$CommandLine" "/renamed" $0
iferrors 0 noRename
File "/oname=$TEMP\rename.exe" "rename.exe"
exec '"$TEMP\rename.exe" /fullpath=$R0'
quit
noRename:
FunctionEnd
Section
SectionEndКод файла, который будет переименовывать основной файл пакета инсталлятора:
Код:
Код: Выделить всё
!include "FileFunc.nsh"
Name "test"
OutFile "rename.exe"
InstallDir "$TEMP"
Function .onInit
call RenameFunc
FunctionEnd
Function RenameFunc
var /global CommandLine
${GetParameters} $CommandLine
${GetOptions} "$CommandLine" "/fullpath=" $0
IfFileExists "$0" 0 noRename
${GetParent} "$0" $R0
Rename "$0" "$R0\Новое имя файла.exe"
sleep 1000
exec '"$R0\Новое имя файла.exe" /renamed'
noRename:
quit
FunctionEnd
Section
SectionEnd2. Код
Код:
Код: Выделить всё
!include "FileFunc.nsh"
Name "test"
OutFile "!test.exe"
InstallDir "$TEMP"
Function .onInit
call CopyInstaller
FunctionEnd
Function CopyInstaller
var /global CommandLine
${GetExeName} $R0
${GetParameters} $CommandLine
${GetOptions} "$CommandLine" "/copydone" $0
iferrors 0 noCopy
CopyFiles /silent "$R0" "$TEMP\$EXEFILE"
exec '"$TEMP\$EXEFILE" /copydone /fullpath=$R0'
quit
noCopy:
${GetOptions} "$CommandLine" "/fullpath=" $0
Delete "$0"
IfFileExists "$0" -1 0
FunctionEnd
Section
SectionEnd
.
коде