Запустить пакетный файл в установщике Windows Commit - PullRequest
6 голосов
/ 16 июня 2009

Не удается изменить MSI установщика Windows для запуска пакетного файла после установки основного вывода. Я искал это и нашел много предложений, но ничего не работает.

Добавить пользовательское действие
Пользовательские действия могут быть только исполняемыми файлами. Пакетный файл не является исполняемым.
Создание исполняемого файла Windows Scripting Host, который запускает пакетный файл
Многие люди пытались это сделать, в том числе на SO , и никто не смог заставить это работать.
Использовать WIX или InstallShield
У меня нет времени или полномочий для изменения технологии установщика компании.
Отредактируйте MSI-файл с помощью Orca и добавьте настраиваемое свойство, затем настраиваемое действие, затем отредактируйте InstallExecuteSequence, ...
Я пытался это часами и создал только установщики, которые выдают системную ошибку при запуске.

Ответы [ 5 ]

10 голосов
/ 16 июня 2009

То, что вы сказали выше, неверно:

Пользовательские действия могут быть только исполняемыми файлы. Пакетный файл не является исполняемым.

Пользовательские действия (даже без таких инструментов, как InstallShield) могут основываться на .EXE, VBScript, JScript или DLL. Если вы пишете DLL, вы можете написать любой код, который вы хотите вызвать, как пакетный файл, или внести любые изменения в систему - ограничений нет.

Обновление : пример, который работал для меня: (запись в таблице CustomAction)

Action Test
Type 34
Source SystemFolder
Target cmd.exe /c c:\test.bat
ExtendedType <blank>
2 голосов
/ 16 июня 2009

Я смог решить эту проблему, создав EXE, состоящий по существу из:

System.Diagnostics.Process.Start(pathToBatchFile);

Добавление EXE-файла в файл MSI и запуск его в качестве пользовательского действия.

1 голос
/ 07 февраля 2012

Хотя ответ, предложенный "Уильямом Леарой", является очень хорошим началом, я нашел лучшее решение здесь , о котором стоит упомянуть.

Еще одним преимуществом этого метода является то, что вы можете поместить свой пакетный файл в папку установки приложения, а не в корневую папку C, но мы используем специальные флаги, чтобы отложить выполнение после действия FileCopy , мы также используем noImpersonate , чтобы иметь более высокие привилегии, необходимые для запуска из Program Files

Несколько заметок:

  1. Используйте TARGETDIR вместо INSTALLDIR
  2. Обязательно указывайте пути.

Это мои два пользовательских действия. В моем случае я хочу заставить собственный командный процессор исправить несколько записей реестра, поэтому я не использую COMSPEC .

Первое действие (тип 50) выполняет команду в источнике с входными аргументами объекта Target, так как тип имеет значение 50 + 1024 + 2048, для него отложено действие с флагом noImpersonate .

  • Действие: FinalAction
  • Тип: 3122
  • Источник: NCOM
  • Цель: / c "[TARGETDIR] Fixup.bat"

Второе действие сразу определяет свойство NCOM :

  • Действие: FinalNativeSys
  • Тип: 51
  • Источник: NCOM
  • Цель: [WindowsFolder] System32 \ cmd.exe

Затем вы должны добавить эти действия в InstallExecuteSequence :

  • Действие: FinalAction
  • Состояние: НЕ установлено
  • Последовательность: 5002

А вот этот:

  • Действие: FinalNativeSys
  • Состояние:
  • Последовательность: 5001

Обратите внимание, что в моем случае я мог легко настроить действия для вызова reg.exe import Fixup.reg . Наконец, можно использовать msitran , как предложено здесь в пост-сборке, для автоматизации процедуры.

1 голос
/ 16 июня 2011

Создайте EXE-файл, который делает временный .bat-файл для изменения в любой каталог, который вы хотите, и CALL другой bat-файл, который делает то, что вам нужно.

Скажите пользовательскому действию использовать этот exe.

Первый аргумент для исполняемого файла CPP - это путь к самому исполняемому файлу. Это может быть использовано для ориентации, и эта информация может быть использована при создании временного .bat

0 голосов
/ 08 октября 2015

В моем случае я добавил «Пользовательские действия».
В папке «Установить» выберите «Добавить пользовательское действие»
Выберите cmd.exe (c: \ windows \ system32 \ cmd.exe)
Затем в свойствах cmd.exe отредактируйте «Аргументы» до
"/ Install / c C: \ myApp.exe --exec-some-action"

...