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

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

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

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

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

Ответ 1

MixedCase свойства "private" и не будут переданы из командной строки.

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

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

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

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

<Property Id="MYPUBLICPROPERTY" Secure="yes" Value="{}">

Ответ 2

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

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

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

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]\"

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

Ответ 3

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

Ответ 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 (в ASA сохраняется другое поведение 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