Как экспортировать и импортировать значения реестра из предыдущей версии установщика в текущую версию установщика с использованием NSIS - PullRequest
0 голосов
/ 09 марта 2019

Я создал новый установщик, используя 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 = "" end function
]]>

Импорт реестра:

  <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"/>

Пожалуйста, помогите мне, как экспортировать и импортировать вызовы сценариев VB с использованием NSIS?

1 Ответ

0 голосов
/ 10 марта 2019

Вы не должны использовать ${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
...