我试图在windows资源管理器中的导航窗格中创建虚拟文件夹,如 OneDrive 或 Dropbox 或 Google 。
我有一个批处理文件(即脚本),它在 (HKCU) 级别创建注册表条目,当我在命令提示符中手动运行它时,它工作得很好。但是,当我尝试使用nsis自定义脚本在 .onInstSuccess 回调中运行相同的.bat文件时,它是行不通的。它只创建像导航窗格中的 xXxxxx (32位) 这样的虚拟文件夹链接,但是当您单击它时什么也不会发生(它应该打开TargetFolderPath,这是.bat文件中提到的)。
下面是我的.bat文件(add.bat)。
@set uuid=f2b4cf36-0e3d-534a-9835-732a0139c194
@echo off
@reg add HKCU\Software\Classes\CLSID\{%uuid%} /ve /t REG_SZ /d "xXxxxx" /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\DefaultIcon /ve /t REG_EXPAND_SZ /d "%SystemRoot%\system32\imageres.dll",-1043 /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%} /v System.IsPinnedToNameSpaceTree /t REG_DWORD /d 0x1 /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%} /v SortOrderIndex /t REG_DWORD /d 0x42 /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\InProcServer32 /ve /t REG_EXPAND_SZ /d "%SystemRoot%\system32\shell32.dll" /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\Instance /v CLSID /t REG_SZ /d {0E5AAE11-A475-4c5b-AB00-C66DE400274E} /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\Instance\InitPropertyBag /v Attributes /t REG_DWORD /d 0x11 /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\Instance\InitPropertyBag /v TargetFolderPath /t REG_EXPAND_SZ /d "%USERPROFILE%\xXxxxx" /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\ShellFolder /v FolderValueFlags /t REG_DWORD /d 0x28 /f
@reg add HKCU\Software\Classes\CLSID\{%uuid%}\ShellFolder /v Attributes /t REG_DWORD /d 0xF080004D /f
@reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{%uuid%} /ve /t REG_SZ /d xXxxxx /f
@reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel /v {%uuid%} /t REG_DWORD /d 0x1 /f
以下是我的 installer.nsh 代码
Function .onInstSuccess
; SetOutPath "$INSTDIR\resources\build\bin\"
ExpandEnvStrings $0 %COMSPEC%
; ExecWait '"$INSTDIR\resources\build\bin\add.bat"'
nsExec::Exec '"$0" /C if 1==1 "$INSTDIR\resources\build\bin\add.bat"'
FunctionEnd
为了更清晰起见,我还在导航窗格中附加了两个working.png和非工作图片。pane虚拟文件夹链接。
注意:我认为nsExec::Exec有一个问题,从.nsh文件打开的.nsh文件的行为与在cmd.exe中手动运行.bat文件不同。
谢谢和问候Rachit V. Sakhidas
发布于 2020-06-17 20:56:48
请记住,这是32位NSIS,因此默认情况下,文件系统映射C:\Windows\System32 32到C:\Windows\SysWOW64 64,注册表将HKCU\Software映射为HKCU\Software\Wow6432Node。因此,reg.exe将其添加到错误的位置,这就是为什么您看到“(32位)”后缀的原因。您可以使用/reg:64参数,但是不需要使用reg.exe,因为NSIS提供了自己的注册表修改方法。
使用这样的用法:(如果有任何排字,很抱歉)
!define /redef uuid "{f2b4cf36-0e3d-534a-9835-732a0139c194}"
!define /redef clsid "Software\Classes\CLSID"
SetRegView 64
WriteRegStr HKCU "${clsid}\${uuid}" "" "xXxxxx"
WriteRegExpandStr HKCU "${clsid}\${uuid}\DefaultIcon" "" '"%SystemRoot%\system32\imageres.dll",-1043'
WriteRegDWORD HKCU "${clsid}\${uuid}" "System.IsPinnedToNameSpaceTree" 0x1
WriteRegDWORD HKCU "${clsid}\${uuid}" "SortOrderIndex" 0x42
WriteRegExpandStr HKCU "${clsid}\${uuid}\InProcServer32" "" '"%SystemRoot%\system32\shell32.dll"'
WriteRegStr HKCU "${clsid}\${uuid}\Instance" "CLSID" "{0E5AAE11-A475-4c5b-AB00-C66DE400274E}"
WriteRegDWORD HKCU "${clsid}\${uuid}\Instance\InitPropertyBag" "Attributes" 0x11