MSBUILD Clean Directory String
-
26-09-2019 - |
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.
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