2017-09-30 14 views
7

MSI 용 WiX Toolset에서 레지스트리 키 값을 원하는 데이터로 업데이트하지 않습니다. k : v가 누락되면 추가됩니다. k : v의 데이터가 0으로 설정되면 완전히 무시됩니다. 실제 문제는 여기에 있습니다. (생각합니다)WiX Toolset을 사용할 때 값이 0으로 설정되면 레지스트리 키가 업데이트되지 않음

기본 목표는이 레지스트리 키 값이 설치 전에 의도 한 데이터 값과 일치하는지 확인하는 것입니다. 키를 추가/업데이트해야하는 경우 다시 부팅하라는 메시지가 나타납니다.

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> 
    <Product Id="*" Name="SampleInstaller" Language="1033" Version="1.0.0.0" Manufacturer="ACME" UpgradeCode="cf6248e9-d7da-4996-9b8e-90072e8510f6"> 
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64"/> 
     <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
     <Feature Id="ProductFeature" Title="SampleInstaller" Level="1"> 
      <ComponentGroupRef Id="ProductComponents" /> 
     </Feature>  
    </Product> 

    <Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder64"> 
     <Directory Id="INSTALLFOLDER" Name="SampleInstaller" /> 
     </Directory> 
    </Directory> 
    <Property Id="VKB_QUERY_HKCU" Secure="yes"> 
     <RegistrySearch Id="VkbVisibleHkcu" 
      Win64="yes" 
      Type="raw" 
      Root="HKCU" 
      Key="Software\Microsoft\TabletTip\1.7" 
      Name="TipbandDesiredVisibility"/> 
    </Property> 
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
     <Component Id="ShowVKB_Registry_HKCU" Guid="{97AB4B1D-C9C8-4B34-9328-FF8CA3ED8992}" Directory="INSTALLFOLDER"> 
     <RegistryKey Id="VKB_Registry_Key_HKCU" Root="HKCU" Key="Software\Microsoft\TabletTip\1.7" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="no"> 
      <RegistryValue Id="VKB_Registry_Value_HKCU" Action="write" Type="integer" Name="TipbandDesiredVisibility" Value="1"/> 
     </RegistryKey> 
     </Component> 
    </ComponentGroup> 
    <InstallExecuteSequence> 
     <ScheduleReboot After="InstallFinalize">NOT (VKB_QUERY_HKCU = "#1")</ScheduleReboot> 
    </InstallExecuteSequence> 
    </Fragment> 
</Wix> 

또한, $LastExitCode%errorlevel%을 검사 할 때 항상 0 대신 16413010을 반환 MSIEXEC에서 종료 코드처럼 보인다. 나는 다른 재부팅 동작을 망쳐 놓지는 않았지만, 재부팅 프롬프트를 사용하면 설치 프로그램이 0이 아닌 상태로 빠져 나가게 될 것이라고 생각했기 때문에 모든 지침도 환영합니다. 설치와 자세한 로그를 생성

답변

0

따라서 샘플은 작동하지만 설치를 다시 실행하여 반복적으로 테스트 할 수는 없습니다. 당신은 먼저 그것을 제거하거나 내가했던 것처럼 우연히 발견해야하고 재실행하기 전에 다시 컴파일해야합니다.

샘플이 다시 컴파일 된 후에 만 ​​작동하는 것으로 나타났습니다. 그래서, 나는 설치 프로그램이 컴파일시에 묶여있는 GUID 또는 뭔가를 가지고 있다고 생각합니다. 그리고 나서 설치 과정에 포함됩니다. 설치를 다시 실행하면 빨리 실행하고 닫을 수 있습니다. 먼저 제거하거나 기존 제품을 제거 할 것을 요구하지 않으므로 설치 프로그램이 키를 작성해야한다는 것을 평가하지 않고 있다고 가정합니다. 더 많은 것을 할 필요가 없을 때 끝났다.

기본적으로 이것은 테스트 버그/내장 된 WiX 지식의 부족이었습니다.

따라서 업그레이드 동작을 특별히 트리거하지 않는 한 항상 MSI를 제거한 다음 다시 실행하십시오.나는 제품이 이미 존재에 대한 오류를 받고되지 않은 이유를

는 잘 모르겠어요. 나는 그것이 기본 행동이 될 것이라고 확신했을 것이다.

+1

다시 컴파일 할 때 버전을 변경하지 않고 업그레이드를 테스트 할 수있게하려면''에 AllowSameVersionUpgrades = "yes"를 지정해야합니다. 이를 사용하지 않고 업그레이드를 테스트하려면 Windows Installer가 버전 비교에서 네 번째 부분을 무시하기 때문에 모든 새로운 빌드가 버전의 처음 세 부분 중 하나를 변경하면서 버전을 업그레이드해야합니다. –

+1

** 모든 제품 ** 빌드 **에서 새로운 제품 ID GUID를 얻고 다른 빌드와 본질적으로 다르다는 것을 지정하는' "를 사용 했으므로 제품이 이미 존재하지 않았습니다 정확하게 동일한 출처와도. 나는 당신이 설치를 개발할 때 실수로 물건을 엉망으로 만들 수 있기 때문에 쉽게 알려진 '깨끗한'상태로 롤백 할 수있는 VM에서 설치 테스트를하는 것이 좋습니다. –

+0

좋은 소리, @ BrianSutherland! VM에서 테스트하는 방법을 확실히 볼 것입니다. 제품 ID가 Visual Studio 확장명으로 압축 된 설치 템플릿으로 이러한 유형의 동작을 기본값으로 설정한다는 것이 이상하게 보입니다. 미리 생성 된 GUID보다 이점이 고려되는 이유가 있습니까? –

0

해야 할 것 :

에 msiexec/I [MSI 경로]/ℓ *의 VX [텍스트 로그 파일 경로]

및 속성 값 등을보고 3010 종료 결과를 얻지 못할 가능성이 가장 큰 이유는 ScheduleReboot가 false로 설정되어 있기 때문입니다.

모든 것이 제대로 작동한다고 가정하면 속성 선언에서 Secure를 Yes로 설정해야하는 문제가 발생할 수 있습니다. 그렇지 않으면 값이 UI 시퀀스 레지스트리 검색에서 실행 시퀀스로 전송되지 않습니다. 로그에 설치 시작시 올바른 값이 표시되지만 나중에이를 잃어 버리면 문제가 발생할 가능성이 큽니다.

귀하의 의견 중 하나는 % errorlevel %을 (를) 나타내지 만, 왜 이것이 관련성이 있는지 명확하지 않습니다. 배치 파일 또는 이와 유사한 것으로부터 이것을 시작한다면 이것은 유용한 정보입니다. 또한 현재 대화 형 사용자와 분리 된 방식으로이 파일을 설치하는 경우이를 알고있는 것도 유용합니다.

로그는 모든 것이 정상임을 나타냅니다. 속성에 올바른 값이 있고 ScheduleReboot 작업이 수행됩니다. 필자가 볼 수있는 유일한 문제는 Windows Installer가 재부팅을 요구하는 대화 상자를 표시하지 않아서 대화 상대에게 3010을 반환하여 재부팅이 필요하다는 것을 호출자에게 알리는 것입니다. Windows Installer가 재부팅 여부를 묻지 않는 명백한 이유는 없습니다 (이는 ScheduleReboot의 기능입니다). 설치가 비 대화식 사용자 컨텍스트에서 실행되는 경우 Windows는 다른 사용자에게 데스크탑 대화 상자를 표시하지 않습니다. 사용자 nobody가 로그온 함).

+0

어 ... 지금은 더 혼란 스러워요. 내 로그에 다음과 같이 표시됩니다. 'PROPERTY CHANGE : VKB_QUERY_HKCU 속성 수정. 현재 값은 'Secure = "yes"'입니다. 새로운 가치 : '# 1'. "나는 문서에서 이해 한 것을 기초로 값을 설정 한 위치에서 질문을 갱신했다. 내 로그 출력 : https://gist.github.com/the-nose-knows/61859eda8719425dee90eaed564d9c64 –

+0

또한 로그는 주 엔진 스레드의 종료로 '3010'을 표시하지만 MSIEXEC은 '% errorlevel'을 확인할 때 여전히 '0'을 반환합니다. %'/'$ LastExitCode' –