如何使用NSIS将注册表值从安装程序的先前版本导出和导入到安装程序的当前版本

时间:2019-03-09 10:13:16

标签: nsis

我已经使用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脚本调用?

1 个答案:

答案 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