2017-10-03 6 views
0

Dans mon code Bundle, je suis en train d'utiliser le résultat d'une recherche de Registre pour définir des variables à utiliser dans ma coutume Boostrapper:Graver: Passe RegistrySearch résultats valeur personnalisée Bootstrapper

<util:RegistrySearch 
    Id="ThirdPartyInstallDirSearch" 
    Variable="THIRDPARTY_INSTALL_DIR" 
    Root="HKLM" 
    Key="SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
    Value="OceanSoftDir" 
    Result="exists" 
    /> 

<Variable Name="THIRDPARTY_INSTALL_DIR" Type="string" Value="$(var.THIRDPARTY_INSTALL_DIR)"/> 

Mais cela donner une erreur: Undefined variable de préprocesseur « $ (var.THIRDPARTY_INSTALL_DIR) »

Fondamentalement, je veux passer le résultat de la recherche de registre à ma demande bootstrapper personnalisée.

Merci

Répondre

1

Comme l'erreur dit $(var.<NAME>) est un préprocesseur de définir un fichier de WXi ou à partir du fichier de projet <DefineConstants>name=value</DefineConstants> ou d'un <?define?>. Vous pouvez en savoir plus sur le préprocesseur here.

Pour votre problème, la recherche de registre elle-même doit définir la variable. Je fais quelque chose de similaire à ce que vous voulez dans un bootstrapper.

<Fragment> 
    <util:RegistrySearch 
     Id="ClientInstalledCheck" 
     Root="HKLM" 
     Key="SOFTWARE\Client" 
     Value="ClientPath" 
     Result="value" 
     Variable="ClientInstalled"/> 
    <util:DirectorySearch 
     Path='[ClientInstalled]' 
     Variable='InstallFolder' 
     After='ClientInstalledCheck' 
     Condition='ClientInstalled' /> 
</Fragment> 

Et puis dans les produits installés par le programme d'amorçage je passerai la valeur « installFolder » à ces installations.

<MsiProperty Name="INSTALLDIR" Value="[InstallFolder]"/> 

De cette façon, si l'utilisateur a installé dans un emplacement d'installation par défaut, nous rejoindrons l'emplacement personnalisé qu'ils ont choisi et utiliser à la place. Si la clé de registre n'existe pas, nous utilisons l'emplacement par défaut.

J'ai aussi la variable installFolder définie par un emplacement par défaut (depuis mon cas d'utilisation est légèrement différente de la vôtre) que

<Variable Name="InstallFolder" Type="string" Value="[ProgramFilesFolder]$(var.CompanyInstallDir)\" bal:Overridable="yes" Persisted="yes"/> 

Où CompanyInstallDir est défini comme une variable de préprocesseur par <DefineConstants> qui est initialement défini quelque part dans un fichier de propriétés MSBuild. Donc, pour expliquer votre problème, vous mélangez des directives et des variables de préprocesseur. Dans votre recherche de registre, vous utilisez Result="exists" qui va mettre la variable THIRDPARTY_INSTALL_DIR à '0' ou '1'. Vous voulez utiliser Result="value". Cela placera la valeur de l'emplacement de Registre dans la variable que vous définissez dans l'attribut Variable="". Si vous faites la recherche de registre + recherche de répertoire avec la condition, vous pouvez correctement définir une variable si et seulement si le registre existe ET le répertoire est réellement présent sur la machine et gère correctement les cas où il n'est pas mais le registre existe encore.

Certaines choses que vous pouvez faire différemment puisque le cas d'utilisation est légèrement différent mais j'espère que cela vous met sur la bonne voie pour faire ce que vous devez faire.