msiexec не передает параметры пользовательскому действию - PullRequest
12 голосов
/ 01 февраля 2010

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 25 октября 2012

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

Вы должны установить свои параметры в командной строке, а также в свойстве «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]\"

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

7 голосов
/ 02 февраля 2010

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

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

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

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

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

<Property Id="MYPUBLICPROPERTY" Secure="yes" Value="{}">
1 голос
/ 05 января 2014

Я знаю, что это старая ветка, но я пробовал разные вещи здесь, и казалось, что я в растерянности. Затем я нашел следующую тему на 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 (в ASCA поведение AS отличается от поведения). Затем вы можете передать значения свойств из командной строки в 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

1 голос
/ 01 февраля 2010

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

...