2009-03-06 19 views
6

Để giải quyết sự cố listed here Tôi phải thay đổi bản ghi InstallExecuteSequence .RemoveExistingProducts trong MSI.Kịch bản để thay đổi bản ghi Trình tự hành động trong MSI

Tôi muốn làm điều này như là một phần của quá trình xây dựng chứ không phải là mucking xung quanh với Orca

+0

cũng bao gồm http://stackoverflow.com/questions/370940/visual-studio-2008-service-installer-project-upgrade-issue, câu hỏi được trích dẫn là bản dup của –

Trả lời

13

Sửa đổi kịch bản MSI_SetProperty.js cho

// MSI_SetActionSequence.js <msi-file> <table> <action> <sequence> 
// Performs a post-build fixup of an msi to set the specified table/action/sequence 

// Constant values from Windows Installer SDK 
var msiOpenDatabaseModeTransact = 1; 

var msiViewModifyInsert   = 1; 
var msiViewModifyUpdate   = 2; 
var msiViewModifyAssign   = 3; 
var msiViewModifyReplace  = 4; 
var msiViewModifyDelete   = 6; 

if (WScript.Arguments.Length != 4) 
{ 
    WScript.StdErr.WriteLine("Usage: " + WScript.ScriptName + " file table action sequence"); 
    WScript.Quit(1); 
} 

var filespec = WScript.Arguments(0); 
var table = WScript.Arguments(1); 
var action = WScript.Arguments(2); 
var sequence = parseInt(WScript.Arguments(3)); 

var installer = WScript.CreateObject("WindowsInstaller.Installer"); 
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact); 

WScript.StdOut.WriteLine("Looking for action:" + action); 

try 
{ 
    var sql = "SELECT Action, Sequence FROM " + table + " WHERE Action = '" + action + "'"; 
    var view = database.OpenView(sql); 

    view.Execute();  
    var record = view.Fetch(); 

    if (record) 
    {  
     while (record) 
     { 
      WScript.StdOut.Write("Found: " + record.StringData(0) + ", " + record.StringData(1) + ", " + record.StringData(2)); 
      if (record.IntegerData(2) != sequence) 
      { 
       WScript.StdOut.WriteLine(" - changing to " + sequence); 
       record.IntegerData(2) = sequence; 
       view.Modify(msiViewModifyUpdate,record); 
      } 
      else 
       WScript.StdOut.WriteLine(" - OK"); 

      record = view.Fetch(); 
     } 

     view.Close(); 
     database.Commit(); 
    } 
    else 
    {   
     view.Close(); 
     throw("Warning - Could not find " + table + "." + action); 
    } 
} 
catch(e) 
{ 
    WScript.StdErr.WriteLine(e); 
    WScript.Quit(1); 
} 

Để gọi kịch bản này để thực hiện các thay đổi về hành động trình tự đã đề cập ở trên, bạn sẽ đặt thông tin sau vào tệp lô và gọi từ sự kiện tạo bài đăng, ví dụ: PostBuildEvent = $ (ProjectDir) PostBuild.bat

cscript.exe MSI_SetActionSequence.js YOURINSTALLER.MSI InstallExecuteSequence RemoveExistingProducts 1525 
+0

Liên kết MS cũng đề cập đến việc xóa InstallExecute hàng. Đây có phải là yêu cầu không? – RBear

+0

Erm - liên kết MS nào? Tôi đã sử dụng điều này như là trong hơn một năm, dường như làm việc tốt. – Ryan

+0

Một trong bài đăng khác của bạn mà bạn liên kết đến http://social.msdn.microsoft.com/forums/en-US/winformssetup/thread/519faa07-5b4e-4546-bfb3-6f233bf7286f Các đường nối hoạt động theo một trong hai cách. – RBear

0

Một số ghi chú cho người khác ở ngoài đó. Tôi đã gặp lỗi "Lỗi 1001. Dịch vụ được chỉ định đã tồn tại" và đã thử ở trên và có vẻ như nó không hoạt động. Dưới đây là những gì tôi gặp phải:

* Đảm bảo thuộc tính RemovePreviousVersions trên dự án trình cài đặt của bạn được đặt thành True. Điều này có vẻ hiển nhiên, rõ ràng, đó là, nếu bạn biết về nó. Theo mặc định, nó được đặt thành Sai. Nếu sai, quy trình trên sẽ không giải quyết được vấn đề của bạn. *

Tôi có một số cụm được cài đặt trong GAC. Có vẻ như khi tôi di chuyển chuỗi RemoveExistingProducts, các tệp này đã bị xóa khỏi GAC, nhưng không được cài đặt lại. Để giải quyết điều này, tôi đã cài đặt tất cả các assembly trong thư mục Application. FYI, tôi đang sử dụng VS2010.

Ngoài ra, một lựa chọn khác. Nếu người dùng chọn "Sửa chữa" khi cố gắng cài đặt lại cùng một phiên bản sản phẩm, họ sẽ vẫn gặp lỗi "Dịch vụ đã chỉ định đã tồn tại". Nếu tôi có thời gian, tôi sẽ cố gắng sửa lỗi này. Nếu ai đó ngoài kia biết cách sửa nó, bạn có thể đăng bài không?

Tất cả những gì đã nói, cảm ơn bạn đã đăng bài này!

0

Giải pháp do Ryan cung cấp giải quyết một phần vấn đề tôi đang gặp phải. Nó thực hiện gỡ cài đặt đầy đủ, tiếp theo là cài đặt.

Tuy nhiên, tôi có một vấn đề khác, trong trường hợp của tôi một số chương trình đang chạy trong nền. Trước khi trình cài đặt có thể chạy, trình cài đặt than phiền rằng một số tệp đang được sử dụng. Và cung cấp cho hộp thoại tiêu chuẩn yêu cầu đóng ứng dụng hoặc khởi động lại để hoàn tất cập nhật.

Có cách nào, ví dụ: một hành động tùy chỉnh hoặc một thiết lập, để giết các tiến trình đang chạy trong nền để trình cài đặt diễn ra suôn sẻ?

+0

Bạn nên đặt câu hỏi này là CÂU HỎI của riêng bạn chứ không phải đăng câu hỏi ở đây như một câu trả lời - hãy xem phần Câu hỏi thường gặp ở trên cùng bên phải. – Ryan

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