Хобрук: Ваш путь к мастерству в программировании

msiexec не передает параметры пользовательскому действию

У меня есть пользовательское действие в установщике MSI, которое вносит некоторые изменения в какой-либо файл конфигурации. мое требование - запустить установку в автоматическом режиме, поэтому я использую msiexec. Вот команда:

msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1

myContextParameter никогда не передается пользовательскому действию, поэтому, когда я делаю context.Parameters["myContextParameter"], я получаю значение null.

Когда я запускаю свой MSI в режиме пользовательского интерфейса, параметр передается правильно. Я также убедился, что имя свойства правильно установлено в файле CustomActionData.


Ответы:


1

Я бился головой об стену по этому поводу, так что вот что я узнал:

Вы должны установить свои параметры в командной строке, а также в свойстве «CustomActionData» для каждого из ваших настраиваемых действий (все, что у вас есть в разделе «Установка», «Зафиксировать» и т. д.)

Ваша командная строка будет выглядеть примерно так:

msiexec /i myInstaller.msi MYFIRSTPARAM=VALUE1 MYSECONDPARAM=VALUE2

Тогда ваши CustomActionData должны выглядеть так:

/myfirstparam=[MYFIRSTPARAM] /mysecondparam=[MYSECONDPARAM]


А теперь куча особых случаев:

  • Похоже, @Klaus прав, вам нужно использовать ALLCAPS в именах параметров.

  • если ваши значения содержат пробелы, вам понадобятся кавычки вокруг них как в командной строке, так и в свойствах CustomActionData, например:

    msiexec /i myInstaller.msi MYFIRSTPARAM="VALUE1" MYSECONDPARAM="VALUE2"

    /myfirstparam="[MYFIRSTPARAM]" /mysecondparam="[MYSECONDPARAM]"

  • если ваши значения заканчиваются косой чертой, как и большинство путей к файлам, у вас возникнет странная проблема: когда msiexec создаст ваши customactiondata, он создаст эту строку:

    /myfirstparam="C:\myfile\" /mysecondparam="C:\myfile\"

    не имеет значения, используете ли вы кавычки в командной строке или нет, если эта косая черта является последним символом в вашем значении, она будет эффективно прочитана как escape-символ и будет экранировать кавычку в вашем свойстве customactiondata. Это вызывает хаос. Решение состоит в том, чтобы либо 1) добавить пробел между вашим параметром и последней кавычкой, а затем не забыть обрезать() его где-то в вашем коде, либо 2) добавить дополнительную косую черту между вашим параметром и кавычкой, чтобы избежать побега персонаж. См. оба метода ниже:

    /myfirstparam="[MYFIRSTPARAM] " /mysecondparam="[MYSECONDPARAM]\"

Надеюсь, это поможет.

25.10.2012

2

MixedCase свойства являются «личными» и не будут переданы из командной строки.

ALLCAPS свойства являются общедоступными и могут быть переданы в командной строке.

Однако только защищенные общедоступные свойства передаются на «сервер» (т. е. сохраняются во время повышения прав UAC). См. документацию по свойствам SecureCustomProperties.

Предполагая, что вы пытаетесь получить доступ к этому свойству в отложенном ЦС, это происходит на стороне сервера, поэтому вам нужно использовать общедоступное свойство (все заглавные буквы), которое также помечено как безопасное.

Вот пример использования WiX:

<Property Id="MYPUBLICPROPERTY" Secure="yes" Value="{}">
02.02.2010
  • Спасибо за ваш ответ, не могли бы вы поделиться каким-либо примером того, как следует объявлять общедоступную собственность ЦС. огромное спасибо 02.02.2010
  • Ну и чем ты тогда пользуешься? 05.02.2010
  • Я мог бы добавить, что подчеркивание не разрешено (делает свойство приватным). Скорее всего так же и с другими персонажами. 07.03.2013
  • То же самое здесь, без использования WiX, хотя инсайдеры MS, похоже, используют его. 22.11.2015

  • 3

    Если вы хотите иметь возможность передавать параметры извне, вам нужно использовать ALLCAPS в именах параметров. Я знаю, это звучит странно, но попробуйте! :-)

    01.02.2010
  • вы имеете в виду назвать это так: msiexec /i myInstaller.msi /l* out.txt MYCONTEXTPARAMETER=value1 01.02.2010
  • Да это оно. Вы не забыли также изменить context.Parameters["MYCONTEXTPARAMETER"]? 01.02.2010
  • Да, Context.Parameters ничего не содержит! 01.02.2010

  • 4

    Я знаю, что это старая тема, но я пробовал здесь разные вещи, и мне казалось, что я в растерянности. Затем я нашел следующий поток на msdn:

    http://social.msdn.microsoft.com/Forums/windows/en-US/8dd009ce-52d5-4737-98c8-89d9831ab60b/unable-to-pass-parameters-to-msi-thro-msiexec-via-command-prompt?forum=winformssetup&prof=required

    Просматривая MSI в ORCA, вы можете увидеть несколько записей в разделе «CustomAction». Эти записи в основном переопределяют значения, переданные из командной строки. Если вы просто удалите записи в таблице CustomAction, например: «CustomTextA_SetProperty_EDIT1», а затем сохраните MSI (сохранение AS имеет другое поведение в ORCA). Затем вы можете передать значения свойств из командной строки в MSI. Это позволит мне установить удаленно с помощью msiexec, и теперь я могу передавать параметры для установки через командную строку. Я предполагаю, что это происходит потому, что логика для значений CustomAction выполняется после заполнения значений свойств из командной строки, что означает, что значения CustomAction перезаписывают заполненные значения командной строки.

    В нижней части темы также есть ссылка для некоторых манипуляций в VS, а не в ORCA.

    http://blogs.technet.com/b/alipka/archive/2007/04/20/how-to-use-custom-actions-in-visual-studio-setup-project-msi-from-command-line.aspx

    05.01.2014
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..