При удалении моего сценария NSIS не удаляются ссылки из каталога ProgramData - PullRequest
3 голосов
/ 11 августа 2011

Есть еще один вопрос новичка NSIS. Вот сценарий:

; -*-nsis-*-    
Name "ndhtest"
OutFile "FooStartMenuTest.exe"    
XPStyle on
!define FOO_SRC c:\users\nhughes\foo

InstallDir "$PROGRAMFILES\Initech\"
Icon ${FOO_SRC}\foo_logo.ico
UninstallIcon ${FOO_SRC}\uninstall.ico

Page instfiles
UninstPage uninstConfirm
UninstPage instfiles

Section
  SetOutPath $INSTDIR
  File ${FOO_SRC}\foo.bat
  WriteUninstaller "$INSTDIR\uninstall.exe"
  CreateDirectory $SMPROGRAMS\Initech
  CreateShortCut $SMPROGRAMS\Initech\Foo.lnk $INSTDIR\foo.bat "" \
    "${FOO_SRC}\foo_logo.ico"
  CreateShortCut $SMPROGRAMS\Initech\Uninstall.lnk $INSTDIR\uninstall.exe "" \
    "${FOO_SRC}\uninstall.ico"
SectionEnd

Section "Uninstall"
  Delete $SMPROGRAMS\Initech\Foo.lnk
  Delete $SMPROGRAMS\Initech\Uninstall.lnk
  RMDir $SMPROGRAMS\Initech
  Delete $INSTDIR\Foo.bat
  Delete $INSTDIR\uninstall.exe
  RMDir $INSTDIR
SectionEnd

Удаление, кажется, работает, за исключением того, что вы оставляете ярлыки в ProgramData:

 Directory of c:\ProgramData\Microsoft\Windows\Start Menu\Programs\Initech

08/10/2011  04:07 PM    <DIR>          .
08/10/2011  04:07 PM    <DIR>          ..
08/10/2011  04:23 PM             1,847 Foo.lnk
08/10/2011  04:23 PM             1,885 Uninstall.lnk
               2 File(s)          3,732 bytes
               2 Dir(s)  1,387,345,117,184 bytes free

В чем заключается мой сценарий, который неправильно работает, оставляя этот материал без дела?

Вот что пишет деинсталлятор в свою консоль (я добавил сообщение DetailPrint со списком $ SMPROGRAMS):

smprograms=C:\Users\nhughes\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Remove folder: C:\Users\nhughes\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Initech\
Delete file: C:\Program Files (x86)\Initech\foo.bat
Delete file: C:\Program Files (x86)\Initech\uninstall.exe
Remove folder: C:\Program Files (x86)\Initech\
Completed

Таким образом, ссылки в ProgramData никогда не упоминаются, вместо этого они ищут ссылки в AppData \ Roaming.

Я тестирую это на Windows 7, но основная проблема здесь заключается в том, что я хотел бы иметь возможность написать скрипт, который работает на всем, от XP до Windows 7, независимо от всех изменений в том, как Windows сжимает вещи разные места в разных версиях. Похоже, это может быть больно.

Ответы [ 2 ]

3 голосов
/ 12 октября 2013

Если к сценарию nsis добавлено DetailPrint, становится очевидно, что NSIS пытается создать файлы в C:\Users, но они фактически создаются в c:\ProgramData. Этот каталог ProgramData - странная вещь, потому что он не виден с dir C:\, однако можно войти в каталог с cd. Такие загадки вызваны Virtual Store , хитрой функцией Windows 7.

Теперь к решению. Приложения Windows должны определять уровень своего исполнения, иначе система может вести себя непредвиденным образом. Помните, некоторые приложения спрашивают, устанавливать ли «только для текущего пользователя» или «для всех пользователей»? Это то, что мы должны объявить.

Если мы вставим команду nsis RequestExecutionLevel user, то ярлыки создаются для текущего пользователя. Если мы сделаем RequestExecutionLevel admin, то мы также должны добавить SetShellVarContext all в разделы установки и удаления.

Этот ответ основан на статье из nsis wiki: Сбой удаления ярлыков в Windows Vista , где приведены примеры для обоих подходов.

0 голосов
/ 11 августа 2011

Из спецификации:

4.9.1.8 RMDir

[/r] [/REBOOTOK] directory_name

Remove the specified directory (fully qualified path with no wildcards). Without /r, the directory will only be removed if it is completely empty. If /r is specified, the directory will be removed recursively, so all directories and files in the specified directory will be removed. If /REBOOTOK is specified, any file or directory which could not have been removed during the process will be removed on reboot -- if any file or directory will be removed on a reboot, the reboot flag will be set. The error flag is set if any file or directory cannot be removed.

Попробуйте добавить /r к строкам RMDir, чтобы заставить его очистить содержимое. Либо так, либо удалите ссылки по отдельности.

...