如何 运行 或在 .nsh 或 nsis 安装程序中执行 .bat 文件(与我们使用 cmd.exe 或其他方式手动 运行 .bat 文件相同)?

How to run or execute .bat file inside .nsh or nsis installer (same like we run .bat file manually using cmd.exe or else)?

我正在尝试在 windows 资源管理器的导航窗格中创建虚拟文件夹,例如 OneDriveDropboxGoogle 驱动器.

我有一个批处理文件(即脚本),它在 (HKCU) 级别创建注册表项,当我在命令提示符下手动 运行 它工作正常。 但是当我在 .onInstSuccess 中尝试 运行 相同的 .bat 文件时,电子构建器使用 nsis 自定义脚本进行回调时它不起作用。它仅在导航窗格中创建虚拟文件夹 link,如 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 [=14=] %COMSPEC%
    ; ExecWait '"$INSTDIR\resources\build\bin\add.bat"'
    nsExec::Exec '"[=14=]" /C if 1==1 "$INSTDIR\resources\build\bin\add.bat"'
FunctionEnd

我还在导航窗格中附上了 working.png 和非 working.png 虚拟文件夹 link 的两张图片,以便更加清晰。

注意:我认为 nsExec::Exec 存在问题,从 .nsh 文件打开 cmd.exe 与在 [=50= 中手动 运行 .bat 文件的行为不同].

感谢和问候 Rachit V. Sakhidas

记住这是 32 位 NSIS,因此默认情况下文件系统将 C:\Windows\System32 映射到 C:\Windows\SysWOW64,注册表将 HKCU\Software 映射到 HKCU\Software\ Wow6432节点。所以 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
WriteRegExpandStr HKCU "${clsid}${uuid}\Instance\InitPropertyBag" "TargetFolderPath" "%USERPROFILE%\xXxxxx"
WriteRegDWORD HKCU "${clsid}${uuid}\ShellFolder" "FolderValueFlags" 0x28
WriteRegDWORD HKCU "${clsid}${uuid}\ShellFolder" "Attributes" 0xF080004D
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace${uuid}" "" "xXxxxx"
WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel" "${uuid}" 0x1
SetRegView lastused