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

问题描述 投票:0回答:1

我试图在windows资源管理器的导航窗格中创建虚拟文件夹,如 OneDriveDropbox谷歌驱动器.

我有一个批处理文件(即脚本),它可以在以下位置创建注册表条目。(HKCU) 当我在命令提示符下手动运行它时,它工作正常。但是当我在命令提示符下运行相同的.bat文件时,它就不工作了。.onInstSuccess 由electron-builder使用nsis自定义脚本进行回调。它只创建虚拟文件夹链接,如 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

以下是我的 安装程序.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和non-working.png虚拟文件夹链接的图片,以便更加清晰。enter image description hereenter image description here

注:我认为是nsExec::Exec的问题,从.nsh文件打开cmd.exe的行为与我手动运行cmd.exe中的.bat文件不一样。

谢谢& RegardsRachit V. Sakhidas。

batch-file registry nsis electron-builder
1个回答
0
投票

请记住,这是32位的NSIS,所以默认情况下,文件系统将C:\Windows/System32映射到C:\Windows/SysWOW64,注册表将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
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
© www.soinside.com 2019 - 2024. All rights reserved.