2017-09-30 67 views
7

Giá trị khóa đăng ký không được cập nhật với dữ liệu dự định của nó bằng WiX Toolset cho MSI. Nếu k: v bị thiếu, nó sẽ thêm nó. Nếu dữ liệu của k: v được đặt thành 0, nó bỏ qua nó hoàn toàn, đó là vấn đề thực tế ở đây (tôi nghĩ)Khoá đăng ký không cập nhật khi giá trị được đặt thành 0 khi sử dụng WiX Toolset

Mục tiêu cơ bản là xác minh giá trị khóa đăng ký này tồn tại với giá trị dữ liệu dự định trước khi cài đặt, và nhắc khởi động lại sẽ kích hoạt nếu khóa phải được thêm/cập nhật.

<?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> 

Ngoài ra, nó có vẻ như mã thoát khỏi MSIEXEC luôn trở 0 thay vì 3010 của 1641 khi kiểm tra $LastExitCode%errorlevel%. Tôi đã không rối tung với các hành vi khởi động lại khác nhau, nhưng tôi nghĩ rằng có dấu nhắc khởi động lại sẽ khiến trình cài đặt của tôi thoát ra không khác, vì vậy bất kỳ hướng dẫn nào cũng được đánh giá cao.

Trả lời

0

Vì vậy, mẫu hoạt động, nhưng bạn không thể kiểm tra liên tục bằng cách chạy lại cài đặt. Bạn phải gỡ bỏ cài đặt nó trước, hoặc vấp ngã khi lý do như tôi đã làm, và biên dịch lại trước khi chạy lại.

Tôi nhận thấy rằng mẫu chỉ hoạt động ngay sau khi biên dịch lại. Vì vậy, tôi đoán trình cài đặt có một GUID hoặc một cái gì đó gắn liền với nó tại thời gian biên dịch, sau đó được bao gồm trong quá trình cài đặt của bạn. Và khi chạy lại quá trình cài đặt, nó sẽ nhanh chóng chạy và đóng, không yêu cầu bạn gỡ cài đặt trước hoặc xóa sản phẩm hiện có, vì vậy tôi cho rằng nó không được đánh giá rằng trình cài đặt của tôi phải viết các phím và đã kết thúc khi không phải làm nhiều hơn nữa.

Vì vậy, về cơ bản đó là lỗi kiểm tra/thiếu kiến ​​thức WiX nội tại.

Vì vậy, hãy luôn gỡ cài đặt MSI của bạn trước khi chạy lại trừ khi bạn đang cố gắng kích hoạt hành vi nâng cấp.

Tôi không chắc tại sao tôi không gặp lỗi về sản phẩm đã tồn tại. Tôi đã nghĩ chắc chắn rằng đó sẽ là hành vi mặc định.

+1

Bạn cần phải xác định 'AllowSameVersionUpgrades =" yes "' trong '' nếu bạn muốn có thể kiểm tra nâng cấp mà không thay đổi phiên bản của bạn khi biên dịch lại. Để kiểm tra nâng cấp mà không cần sử dụng, bạn sẽ cần phải nâng cấp phiên bản với mỗi bản dựng mới thay đổi một trong 3 phần đầu tiên của phiên bản vì Windows Installer bỏ qua phần thứ 4 trong so sánh phiên bản. –

+1

Bạn không nhận được sản phẩm đã tồn tại vì bạn đã sử dụng '' chỉ định rằng mọi ** build ** bạn sẽ nhận được GUID Id sản phẩm mới và về cơ bản khác với các bản dựng khác ngay cả với chính xác cùng một nguồn. Tôi rất muốn đề nghị thực hiện cài đặt thử nghiệm trên máy ảo, nơi bạn có thể dễ dàng quay trở lại trạng thái 'sạch' đã biết vì bạn có thể vô tình gây ra sự cố khi phát triển cài đặt. –

+0

Nghe hay đấy, @BrianSutherland! Tôi chắc chắn sẽ thấy về thử nghiệm chúng trên máy ảo. Nó có vẻ lạ với tôi rằng ID sản phẩm sẽ mặc định cho loại hành vi đó với các mẫu thiết lập được đóng gói với phần mở rộng Visual Studio. Có một số loại lý do tại sao đó được coi là một lợi thế so với GUID được tạo trước không? –

0

Đỗ rằng cài đặt và tạo một bản ghi verbose với:

msiexec/I [đường dẫn đến msi]/l * vx [đường dẫn đến một tập tin văn bản đăng nhập]

và nhìn vào giá trị tài sản, vv Lý do rất có thể khiến bạn không nhận được kết quả thoát 3010 là ScheduleReboot bị sai.

Giả sử mọi thứ khác hoạt động như dự định, có thể bạn cần đặt Bảo mật thành Có trong tuyên bố thuộc tính của mình, nếu không giá trị sẽ không được chuyển từ tìm kiếm đăng ký chuỗi giao diện người dùng thành chuỗi thực thi. Nếu nhật ký cho thấy nó nhận được giá trị chính xác khi bắt đầu cài đặt nhưng mất nó sau này rất có thể là vấn đề.

Một trong các nhận xét của bạn đề cập đến% errorlevel% nhưng không rõ lý do tại sao điều này có liên quan. Nếu bạn đang bắt đầu điều này từ một tập tin thực thi hoặc tương tự thì đây là thông tin hữu ích để thêm vào. Ngoài ra, nếu bạn đang cài đặt điều này theo cách nào đó tách biệt với người dùng tương tác hiện tại thì điều này cũng hữu ích khi biết.

Nhật ký dường như cho biết mọi thứ đều ổn. Các thuộc tính có các giá trị trông đúng, và hành động ScheduleReboot được thực hiện. Vấn đề duy nhất tôi thấy là Windows Installer không hiển thị hộp thoại yêu cầu người dùng thực hiện việc khởi động lại, vì vậy nó không tương tác, điều này sẽ trả về 3010 để báo cho người gọi biết rằng cần khởi động lại. Không có lý do rõ ràng tại sao Windows Installer không nhắc khởi động lại (đó là những gì ScheduleReboot làm) nhưng nếu cài đặt đang chạy trong ngữ cảnh người dùng không tương tác thì Windows sẽ không hiển thị hộp thoại trên màn hình cho người dùng khác (hoặc không không ai được đăng nhập).

+0

Uh ... Tôi thậm chí còn bối rối hơn. Tôi nhận được điều này trong nhật ký của mình: 'SỞ HỮU TRÍ TUỆ: Sửa đổi thuộc tính VKB_QUERY_HKCU. Giá trị hiện tại của nó là 'Secure = "yes"'. Giá trị mới của nó: '# 1'.' Tôi đã cập nhật câu hỏi với nơi tôi đặt các giá trị, dựa trên những gì tôi hiểu từ tài liệu. Đầu ra nhật ký của tôi: https://gist.github.com/the-nose-knows/61859eda8719425dee90eaed564d9c64 –

+0

Ngoài ra, nhật ký hiển thị '3010' làm lối thoát của luồng động cơ chính nhưng MSIEXEC vẫn đang trả về' 0' khi kiểm tra '% errorlevel % '/' $ LastExitCode' –

Các vấn đề liên quan