Question

J'ai une propriété dans MSBuild pour représenter le répertoire au-dessus du MSBuildProjectDirectory:

<PropertyGroup>
    <BuildDir>$(MSBuildProjectDirectory)\..</PRSBuildDir>
</PropertyGroup>

J'ai ensuite besoin d'utiliser cette propriété, mais j'ai besoin que la chaîne de répertoire soit nettoyée afin qu'elle n'inclut pas le ... En d'autres termes, j'ai besoin du .. évalué, de sorte que si le fichier de projet actuel est en C:\Test\Tom\MyDir, alors j'ai besoin d'une propriété contenant la chaîne C:\Test\Tom.

La raison pour laquelle je demande, c'est parce que j'essaie d'exécuter une commande comme ceci:

msiexec /passive /i "D:\Build\2.3.84.40394\Deployment\..\Vendor\LogParser.msi"

Mais il se plaint du chemin vers le MSI: This installation package could not be opened. Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer package.

Était-ce utile?

La solution

Il y a un Tâche de converttoabsolutepath, cette utilisation?

Autres conseils

La meilleure méthode que j'ai en ce moment est ci-dessous, mais je me demandais s'il pourrait y avoir une meilleure façon.

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <BuildDir>$(MSBuildProjectDirectory)\..</BuildDir>
    </PropertyGroup>

    <Target Name="Test">
        <ItemGroup>
            <CleanBuildDir Include="$(BuildDir)" />
        </ItemGroup>

        <PropertyGroup>
            <BuildDir>%(CleanBuildDir.FullPath)</BuildDir>
        </PropertyGroup>

        <Message Text="$(BuildDir)" />
    </Target>
</Project>

Si tu veux avoir le caractère générique évalué, tu devrais Utiliser l'article au lieu de la propriété.

<ItemGroup>
  <BuildDir Include="$(MSBuildProjectDirectory)\.."/>
</ItemGroup>

<Target Name="ExecMSIExec">
  <Exec Command="msiexec /passive /i %(BuildDir.FullPath)\Vendor\LogParser.msi"/>
</Target>

(J'ai supprimé ma réponse car je n'ai pas vu que Tom avait répondu exactement de la même manière!)

Soit dit en passant, pourquoi ne définissez-vous pas l'attribut "WorkingDirectory" de la tâche Exec où vous appelez réellement MSIEXEC pour être l'emplacement de votre MSI - de cette façon, vous ne rencontrerez pas les problèmes de longueur du chemin

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top