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