Документы MSDN для RemoveExistingProducts говорят, что это то, что вы должны делать, поэтому это одна из причин. Он указывает, что обычная последовательность с InstallExecute - InstallExecute, RemoveExistingProducts и InstallFinalize. В противном случае REP должен произойти до того, как произойдут какие-либо фактические изменения в системе, поэтому сразу после InstallInitialize или InstallValidate - это выбор правильной последовательности, это более неясное правило «перед действиями скрипта, которые изменяют систему».
Другая причина в том, что InstallExecute завершает транзакцию установки, поэтому вы не удаляете старый продукт, когда только что установленное обновление не полностью завершено, а REP - до InstallFinalize.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa369502(v=vs.85).aspx
Таким образом, в целом, РЭП должен быть упорядочены, прежде чем что-либо сделать в системе или после того, как все необходимые изменения были совершены с InstallExecute, если это в сделке. Кроме того, если он находится внутри транзакции, он включается в откат, который будет переустанавливать старый продукт, который будет обновлен. REP после InstallFinalize означает, что удаление может завершиться неудачей и откат, переустановка продукта, приводящего к появлению старых и новых продуктов в системе.
Документация, которую вы указали после «InstallInitialize», не полностью охватывает все возможности, поскольку после InstallFinalize не означает, что требуется InstallExecute. Возможно, это было сделано из контекста, но документы MSDN достаточно полны.
Возможно, мне это не хватает, но я просматриваю https://msdn.microsoft.com/en-us/library/windows/desktop/aa371197(v=vs.85).aspx и могу " t, кажется, находит прямую формулировку, может быть, это подразумевается? – NGambit
Я не уверен в «... поэтому вы не удаляете старый продукт, когда только что установленное обновление не полностью завершено». По моему мнению, размещение REP после InstallInitialize означает, что старая версия продукта будет полностью удалена до того, как будет установлена новая. Конечно, поскольку REP запланирован на отложенной фазе, при отказе установки новой версии будет отката старой версии. – NGambit
Если бы вы сказали «сразу после InstallInitialize», я бы согласился, но InstallExecute-REP-InstallFinalize также после InstallInitialize, и в этом случае новый продукт уже установлен. Я расширил ответ, потому что «после InstallInitialize» охватывает все документированные виды использования REP, а InstallExecute, конечно, не требуется для всех них. – PhilDW