Как запустить или выполнить файл .bat внутри установщика .n sh или nsis (так же, как мы запускаем .bat-файл вручную с помощью cmd.exe или иначе)? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать виртуальную папку на панели навигации в windows проводнике, например OneDrive или Dropbox или Google Диск .

У меня есть один командный файл (то есть сценарий), который создает запись реестра на уровне (HKCU) , который отлично работает, когда я запускаю его вручную в командной строке. Но он не работает, когда я пытаюсь запустить тот же файл .bat внутри .onInstSuccess обратного вызова с помощью электронного строителя с использованием настраиваемого сценария 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

Ниже мой installer.n sh код

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 here enter image description here

Примечание: я думаю, что есть проблема с nsExe c :: Exe c, открытым cmd.exe из. n sh файл не ведет себя так же, как вручную я запускал .bat файл в cmd.exe.

Спасибо и С уважением, Рачит В. Сахидас

1 Ответ

0 голосов
/ 17 июня 2020

Помните, что это 32-битный NSIS, поэтому по умолчанию файловая система отображает C: \ Windows \ System32 на C: \ Windows \ SysWOW64, а реестр сопоставляет HKCU \ Software с HKCU \ Software \ Wow6432Node. Reg.exe добавляет его не в то место, поэтому вы видите суффикс «(32-bit)». Вы можете использовать параметр / 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
...