我已经使用NSIS创建了一个新的安装程序。安装此新版本的安装程序时,如果存在先前版本的安装程序,则我将删除该安装程序并安装新的安装程序。
但是在卸载先前的安装程序之前,我想存储(导出)先前安装程序的注册表项,然后使用新的安装程序导入(还原).reg文件值。
我以前的安装程序注册表路径是:\ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ EMR \ 3.01.00
我当前的安装程序注册表路径是:\ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ EMR \ 4.01.00
我正在使用NSIS导出(存储注册表值),如下所示:
${registry::SaveKey} "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\EMR" "C:\Code\Changes\regfile.reg" "/G=1 /D=2" $R0
${registry::Unload}
MessageBox MB_OK "PPC-registry::SaveKey$\n$\n\
Errorlevel: [$R0]"
**Importing the registry values like as shown below:**
IfFileExists“ C:\ Code \ Changes \ regfile.reg” file_found file_not_found
file_found:
${registry::RestoreKey} "C:\Code\Changes\regfile.reg" $R0
MessageBox MB_OK "PPC-registry::RestoreKey$\n$\n\
Errorlevel: [$R0]"
转到end_of_test 文件未找到: MessageBox MB_ICONEXCLAMATION | MB_OK“文件不存在” 结束测试:
但是,使用上述代码片段还原.reg文件时,注册表中显示的是EMR \ 3.01.00和EMR \ 4.01.00。 而且在导入之后,注册表项值的顺序也发生了变化。
请帮助我如何还原旧的注册表值,但仅显示EMR \ 4.01.00。
方法2:
我也正在使用VB脚本来导出和导入注册表值,如下所示:
导出注册表:
outfile = userDir&“ \ tempkeyPCPE.reg”
键=“ HKEY_LOCAL_MACHINE \ SOFTWARE \ APC”
返回= oShell.Run(“ regedit / s / e”“”&outfile&“”“”“”&key&“”“”,0,真)
userDir =“”
终端功能
]]>
导入注册表:
<Property Id="IMPORT_REG">
<![CDATA[
function importReg
Dim regfile, userDir, oShell
Set oShell = CreateObject("WScript.Shell")
userDir = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
regfile = userDir & "\tempkeyPCPE.reg"
Return = oShell.Run("regedit /s """ & regfile & """",0,True)
userDir = ""
end function
]]>
</Property>
然后使用WIX安装程序调用EXPORT_REG和IMPORT_REG,如下所示:
<CustomAction Id="ExportRegistry"
VBScriptCall="exportReg"
Property="EXPORT_REG" Return="ignore"/>
<CustomAction Id="ImportRegistry"
VBScriptCall="importReg"
Property="IMPORT_REG"
Execute="deferred"
Impersonate="no" Return="ignore"/>
请帮助我如何使用NSIS导出和导入VB脚本调用?
答案 0 :(得分:0)
您不应使用${registry::RestoreKey}
,而应使用${registry::MoveKey}
移动键。
如果仅支持Windows 2000及更高版本,则还可以直接调用API:
!include LogicLib.nsh
!include WinCore.nsh
Section
WriteRegStr HKCU "Software\Test\v1" "Hello" "World"
WriteRegDWORD HKCU "Software\Test\v1\Number" "" 42
!define /IfNDef MAXIMUM_ALLOWED 0x02000000
!define /IfNDef KEY_READ 0x20019
System::Call 'ADVAPI32::RegOpenKeyEx(p ${HKEY_CURRENT_USER}, t "Software\Test\v1", i 0, i ${KEY_READ}, *p0r1)i.r0'
${If} $0 = 0
System::Call 'ADVAPI32::RegCreateKeyEx(p ${HKEY_CURRENT_USER}, t "Software\Test\v2", i 0, p 0, i 0, i ${MAXIMUM_ALLOWED}, p 0, *p0r2, *i)i.r0'
${If} $0 = 0
System::Call 'ADVAPI32::RegCopyTree(pr1, p0, pr2)i.r0'
${If} $0 == "error"
System::Call 'SHLWAPI::SHCopyKey(pr1, p0, pr2, i0)i.r0'
${EndIf}
${If} $0 = 0
DeleteRegKey HKEY_CURRENT_USER "Software\Test\v1" ; Delete the old key (optional)
${EndIf}
${EndIf}
${EndIf}
SectionEnd