gpt4 book ai didi

nsis - 我的 NSIS 脚本的卸载没有从 ProgramData 目录中删除链接

转载 作者:行者123 更新时间:2023-12-05 01:29:23 24 4
gpt4 key购买 nike

还有一个新手 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

我的脚本出了什么问题导致这些东西一直悬而未决?

这是卸载程序写入其控制台的内容(我添加了一条列出 $SMPROGRAMS 的 DetailPrint 消息):

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 松鼠在不同版本的不同点。这看起来可能很痛苦。

最佳答案

如果 DetailPrint 被添加到 nsis 脚本中,很明显 NSIS 试图在 C:\Users 下创建文件,但它们实际上是在c:\ProgramData。这个ProgramData 目录是个奇怪的东西,因为用dir C:\ 看不到它,但是可以用cd 进入该目录。此类谜团是由 Virtual Store 引起的,这是 Windows 7 的一项棘手功能。

现在是解决方案。 Windows 应用程序应该定义它们的执行级别,否则系统可能会以意想不到的方式运行。您还记得一些应用程序询问是安装“仅供当前用户使用”还是“供所有用户使用”?这是我们需要声明的。

如果我们插入 nsis 指令 RequestExecutionLevel user,则为当前用户创建快捷方式。如果我们执行 RequestExecutionLevel admin,那么我们还应该将 SetShellVarContext all 添加到安装和卸载部分。

此答案基于 nsis wiki 上的文章:Shortcuts removal fails on Windows Vista ,其中给出了两种方法的示例。

关于nsis - 我的 NSIS 脚本的卸载没有从 ProgramData 目录中删除链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7018122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com