首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在.bat或中运行或执行.nsh文件(就像我们手动使用cmd.exe或cmd.exe运行.bat文件一样)?

如何在.bat或中运行或执行.nsh文件(就像我们手动使用cmd.exe或cmd.exe运行.bat文件一样)?
EN

Stack Overflow用户
提问于 2020-06-17 17:33:10
回答 1查看 757关注 0票数 0

我试图在windows资源管理器中的导航窗格中创建虚拟文件夹,如OneDriveDropboxGoogle

我有一个批处理文件(即脚本),它在(HKCU)级别创建注册表条目,当我在命令提示符中手动运行它时,它工作得很好。但是,当我尝试使用nsis自定义脚本在.onInstSuccess回调中运行相同的.bat文件时,它是行不通的。它只创建像导航窗格中的xXxxxx (32位)这样的虚拟文件夹链接,但是当您单击它时什么也不会发生(它应该打开TargetFolderPath,这是.bat文件中提到的)。

下面是我的.bat文件(add.bat)。

代码语言:javascript
复制
@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代码

代码语言:javascript
复制
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

EN

Stack Overflow用户

回答已采纳

发布于 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提供了自己的注册表修改方法。

使用这样的用法:(如果有任何排字,很抱歉)

代码语言:javascript
复制
!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
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62435016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档