Скрипт для изменения записей последовательности действий в MSI

Для решения проблемы перечисленные здесь Мне нужно изменить запись InstallExecuteSequence .RemoveExistingProducts в MSI.

Я хочу сделать это как часть процесса сборки, а не возиться с Orca


person Ryan    schedule 06.03.2009    source источник
comment
также охватывает http://stackoverflow.com/questions/370940/visual-studio-2008-service-installer-project-upgrade-issue, цитируемый вопрос является дублированием   -  person Ruben Bartelink    schedule 06.03.2009


Ответы (3)


Изменение скрипта MSI_SetProperty.js дает

// 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);
}

Чтобы вызвать этот сценарий для выполнения изменения в последовательности действий, упомянутой выше, вы должны поместить следующее в пакетный файл и вызвать его из события пост-сборки, например. PostBuildEvent = $ (ProjectDir) PostBuild.bat

cscript.exe MSI_SetActionSequence.js YOURINSTALLER.MSI InstallExecuteSequence RemoveExistingProducts 1525
person Ryan    schedule 06.03.2009
comment
Ссылка MS также упоминает удаление строки InstallExecute. Это обязательно? - person RBear; 18.10.2010
comment
Эээ - какая ссылка на MS? Я использую это как есть больше года, кажется, работает нормально. - person Ryan; 18.10.2010
comment
Тот, что в другом вашем сообщении, на который вы ссылаетесь вверху social.msdn.microsoft.com/forums/en-US/winformssetup/thread/ Швы работают в любом случае. - person RBear; 22.10.2010

Некоторые заметки для других. У меня возникла проблема «Ошибка 1001. Указанная служба уже существует», я попробовал описанное выше, но, похоже, это не сработало. Вот с чем я столкнулся:

* Убедитесь, что для свойства RemovePreviousVersions в вашем проекте установщика установлено значение True. Это кажется очевидным - очевидным, если вы об этом знаете. По умолчанию установлено значение False. Если False, описанная выше процедура не решит вашу проблему. *

У меня в GAC установлено несколько сборок. Похоже, что когда я переместил последовательность RemoveExistingProducts, эти файлы были удалены из GAC, но не переустановлены. Чтобы решить эту проблему, я установил все сборки в папку приложения. К вашему сведению, я использую VS2010.

Еще одна придирка. Если пользователь выбирает «Восстановить» при попытке переустановить ту же версию продукта, он все равно получит ошибку «Указанная служба уже существует». Если у меня будет время, я постараюсь это исправить. Если кто-то еще знает, как это исправить, не могли бы вы опубликовать?

Все, что сказано, спасибо, что разместили это!

person Eric    schedule 16.11.2010

Решение, предоставленное Райаном, касается части проблемы, с которой я столкнулся. Он выполняет полное удаление с последующей установкой.

Однако у меня есть другая проблема, в моем случае некоторые программы работают в фоновом режиме. Перед запуском установщика он жалуется, что некоторые файлы уже используются. И выдает стандартное диалоговое окно с просьбой либо закрыть приложение, либо перезапустить для завершения обновления.

Есть ли способ, например. настраиваемое действие или параметр, чтобы убить процессы, работающие в фоновом режиме, чтобы установщик работал без сбоев?

person Markus2k    schedule 14.02.2012
comment
Лучше задать это как свой ВОПРОС, а не публиковать здесь как ОТВЕТ - ознакомьтесь с часто задаваемыми вопросами вверху справа. - person Ryan; 14.02.2012