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

问题描述 投票:0回答:1

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

nsis
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.