Dans MSBuild 4.0 La méthode la plus simple est la suivante :
$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)\your\path'))
Cette méthode fonctionne même si le script est <Import>
ed dans un autre script ; le chemin est relatif au fichier contenant le code ci-dessus.
(consolidé à partir de Réponse d'Aaron ainsi que la dernière partie de La réponse de Sayed )
Dans MSBuild 3.5 vous pouvez utiliser l'option ConvertToAbsolutePath tâche :
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Test"
ToolsVersion="3.5">
<PropertyGroup>
<Source_Dir>..\..\..\Public\Server\</Source_Dir>
<Program_Dir>c:\Program Files (x86)\Program\</Program_Dir>
</PropertyGroup>
<Target Name="Test">
<ConvertToAbsolutePath Paths="$(Source_Dir)">
<Output TaskParameter="AbsolutePaths" PropertyName="Source_Dir_Abs"/>
</ConvertToAbsolutePath>
<Message Text='Copying "$(Source_Dir_Abs)" to "$(Program_Dir)".' />
</Target>
</Project>
Sortie pertinente :
Project "P:\software\perforce1\main\XxxxxxXxxx\Xxxxx.proj" on node 0 (default targets).
Copying "P:\software\Public\Server\" to "c:\Program Files (x86)\Program\".
Un peu longuet si vous voulez mon avis, mais ça marche. Ce sera relatif au fichier de projet "original", donc si placé dans un fichier qui obtient <Import>
ed, ce ne sera pas relatif à ce fichier.
Dans MSBuild 2.0 il existe une approche qui ne résout pas " ". Elle se comporte cependant comme un chemin absolu :
<PropertyGroup>
<Source_Dir_Abs>$(MSBuildProjectDirectory)\$(Source_Dir)</Source_Dir_Abs>
</PropertyGroup>
En $(MSBuildProjectDirectory) La propriété réservée est toujours le répertoire du script qui contient cette référence.
Il sera également relatif au fichier de projet "original", donc s'il est placé à l'intérieur d'un fichier qui reçoit l'extension <Import>
ed, ce ne sera pas relatif à ce fichier.