Обнаружение наличия каталога во время установки - PullRequest
6 голосов
/ 08 февраля 2011

В WiX DirectorySearch может использоваться, чтобы определить, существует ли определенный каталог на целевом компьютере. Но я не понимаю, существует ли согласованный способ определить, что каталог не существует .

Например:

<Property Id="INSTALLDIR" Secure="yes">
  <RegistrySearch Id='InstallDir' Type='directory'
    Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/>
</Property>
<Property Id='IS_INSTALLED' Secure='yes'>
  <DirectorySearch Id='IsInstalled' Path='[INSTALLDIR]' />
</Property>

Если существует раздел реестра и каталог, свойству IS_INSTALLED присваивается путь, возвращаемый DirectorySearch.

Когда каталог не существует, IS_INSTALLED, кажется, установлен на "C: \".

Это состояние, подобное:

<Condition>NOT (IS_INSTALLED = "C:\")</Condition>

надежный способ обнаружить, что каталог был найден? Есть ли лучший способ?

Ответ: Вот код WiX, основанный на ответе mrnxs , который я принял

<Property Id="PRODUCT_IS_INSTALLED" Secure="yes">
  <RegistrySearch Id='RegistrySearch1' Type='directory'
    Root='HKLM' Key='Software\Company\Product\Version\Install' Name='Path'>
    <DirectorySearch Id='DirectorySearch1' Path='[PRODUCT_IS_INSTALLED]'/>
  </RegistrySearch>
</Property>

<CustomAction Id='SET_INSTALLDIR'
              Property='INSTALLDIR'
              Value='[PRODUCT_IS_INSTALLED]'/>

<InstallExecuteSequence>
  <Custom Action='SET_INSTALLDIR' After='AppSearch'></Custom>
</InstallExecuteSequence>

Ответы [ 3 ]

4 голосов
/ 09 февраля 2011

Обычно это происходит, когда свойство используется как папка на основе свойств. В этом случае действие CostFinalize автоматически устанавливает для свойства правильный путь (например, «C: \»), чтобы папка могла использоваться установщиком Windows.

Поскольку этот путь генерируется автоматически, вы не можете быть уверены, что он будет "C: \" на всех ваших клиентских компьютерах, поэтому вам не следует использовать это значение в ваших условиях. Вместо этого вы можете попробовать это:

  • использовать пользовательское свойство для вашей папки
  • используйте тип 51 настраиваемое действие (свойство, установленное с форматированным текстом), чтобы установить для этого свойства допустимый путь по умолчанию (например, «[ProgramFilesFolder] MyCompany \ MyProduct»)
  • использовать другое свойство для поиска
  • используйте другое настраиваемое действие типа 51, чтобы установить свойство папки в свойстве поиска

Например, если ваш поиск IS_INSTALLED, ваша папка может использовать IS_INSTALLED_PATH. Для IS_INSTALLED_PATH может быть задан путь по умолчанию, и после действия AppSearch вы можете установить для него значение IS_INSTALLED, если поиск что-то нашел.

Этот способ можно использовать для кондиционирования:

IS_INSTALLED

или

NOT IS_INSTALLED
0 голосов
/ 19 декабря 2015

Другой подход может быть таким: в этом вы можете продолжить последовательность установки, если хотите установить InstallDir в любое другое место, если SystemDir и RegisteryDir не совпадают

<Property Id="RegisteryDir" Secure="yes">
<RegistrySearch Id='InstallDir' Type='directory'
Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/>
</Property>
<Property Id='SystemDir' Secure='yes'>
<DirectorySearch Id='IsInstalled' Path='[RegisteryDir]' />
</Property>
<CustomAction Id="SET_INSTALL_DIR" Property="INSTALLDIR" Value="[SystemDir] />

<InstallExecuteSequence>
<Custom Action='SET_INSTALLDIR' After='AppSearch'>
SystemDir AND SystemDir=RegisteryDir
</Custom>
</InstallExecuteSequence> 
0 голосов
/ 09 февраля 2011

Понимание шаблонов AppLearch RegLocator и DrLocator может быть немного сложнее.Я рекомендую на мгновение игнорировать условие и зарегистрировать установку, чтобы убедиться, что AppSearch правильно устанавливает нужные свойства.Исправьте проблемы, которые вы найдете на этом конце в первую очередь.Когда это будет работать, для свойства будет установлено значение реестра или путь к каталогу.

Тогда вы сможете использовать:

<Condition>IS_INSTALLED/>   <!-- it's not important what the value is, just that it exists -->
<Condition>Not IS_INSTALLED/>

Кстати, я бы не использовалсобственность ИНСТАЛЛДИР.В моих установщиках (InstallShield) это имеет особое значение в качестве основного центра установки.

...