我使用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]"
goto end_of_test file_not_found:MessageBox MB_ICONEXCLAMATION | MB_OK“文件不存在”end_of_test:
但是在恢复.reg文件时使用上面的代码片段,在注册表中显示EMR \ 3.01.00和EMR \ 4.01.00。并且在导入之后,注册表键值的顺序也在变化。
请帮我如何恢复旧的注册表值,但只显示EMR \ 4.01.00。
方法2:
我也使用VB脚本导出和导入注册表值,如下所示:
导出注册表:
outfile = userDir&“\ tempkeyPCPE.reg”key =“HKEY_LOCAL_MACHINE \ SOFTWARE \ APC”Return = oShell.Run(“regedit / s / e”“”&outfile&“”“”“”“&key&”“”“” ,0,True)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脚本调用?
你不应该使用${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