获取%ALLUSERSPROFILE%的NSIS变量

时间:2014-03-18 05:19:20

标签: windows installer nsis

%ALLUSERSPROFILE%是否有NSIS变量?

如果不是,您知道如何使用NSIS代码获取此环境变量吗?

注意:如果我使用ReadEnvStr $R7 "ALLUSERSPROFILE",则$R7包含C:/ProgramData,因为安装程序已请求提升的权限(RequestExecutionLevel admin)。这太令人沮丧了!

2 个答案:

答案 0 :(得分:5)

从Vista%ALLUSERSPROFILE%开始是%SystemDrive%\ ProgramData。以前在“所有用户”下的某些内容已移至%Public%,其余内容在%ProgramData%中。

有几种方法可以获得这个目录,但他们都应该给你相同的答案:

ReadEnvStr $0 "ALLUSERSPROFILE"
DetailPrint %ALLUSERSPROFILE%=$0


System::Call 'userenv::GetAllUsersProfileDirectory(t.r0,*i${NSIS_MAX_STRLEN})i.r1'
DetailPrint GetAllUsersProfileDirectory=$0


; In Vista+ %ALLUSERSPROFIL% and CSIDL_COMMON_APPDATA is the same directory:
SetShellVarContext all
DetailPrint All:Appdata=$AppData


!define FOLDERID_ProgramData {62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}
System::Call 'shell32::SHGetKnownFolderIDList(g"${FOLDERID_ProgramData}", i0x1000, i0, *i.r1)i.r0'
${If} $0 == 0
    System::Call 'shell32::SHGetPathFromIDList(ir1,t.r0)'
    System::Call 'ole32::CoTaskMemFree(ir1)'
    DetailPrint SHGetKnownFolderIDList=$0
${EndIf}

答案 1 :(得分:0)

要扩展@Anders回复,您还可以使用 SHGetSpecialFolderPath 并进行简单的一行调用,以接收操作系统上文件夹的路径。


System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i 0x23, i0)i.r0'

将其与 CSIDL值一起使用,您只需调用一个函数并弹出返回。

Function ".OnInit"
  System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i 0x23, i0)i.r0'
  pop $1
  MessageBox MB_OK|MB_ICONINFORMATION "$1"
FunctionEnd

Section ""
  ; blank section (so the script runs)
SectionEnd

这会将 C:\ ProgramData(Vista +) C:\ Documents and Settings \ All Users \ Application Data(XP)返回到 $ 1 并显示一个显示路径的消息框。

通过切换CSIDL值( 0x23 ),您可以将路径返回到一堆不同的系统文件夹。


以下是一些常用的CSIDL值,可用于返回路径:

  • 0x0桌面
  • 0x2程序
  • 0x5我的文件
  • 0x6收藏夹
  • 0x7启动
  • 0x8最近的文件
  • 0x9 Sendto文件
  • 0x10桌面目录
  • 0x11我的电脑
  • 0x14字体目录
  • 0x15 Windows模板
  • 0x20 Internet Cache
  • 0x21 Cookies
  • 0x22历史
  • 0x23通用应用程序数据
  • 0x25系统
  • 0x26程序文件
  • 0x27我的照片
  • 0xb StartMenu
  • 0xd我的音乐
  • 0x1a应用程序数据
  • 0x1c本地应用程序数据
  • 0x2b通用程序文件