MSBuild 4.0では、最も簡単な方法は次のとおりです。
$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)\your\path'))
この方法は、スクリプトが<Import>
別のスクリプトに組み込まれている場合でも機能します。パスは、上記のコードを含むファイルからの相対パスです。
(アーロンの回答とサイードの回答の最後の部分から統合)
MSBuild 3.5では、 ConvertToAbsolutePathタスクを使用できます。
<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>
関連する出力:
Project "P:\software\perforce1\main\XxxxxxXxxx\Xxxxx.proj" on node 0 (default targets).
Copying "P:\software\Public\Server\" to "c:\Program Files (x86)\Program\".
あなたが私に尋ねると、少し長くなりますが、うまくいきます。これは「元の」プロジェクト ファイルに対して相対的であるため、<Import>
ed を取得するファイル内に配置されている場合、これはそのファイルに対して相対的ではありません。
MSBuild 2.0 では、".." を解決しないアプローチがあります。ただし、絶対パスのように動作します。
<PropertyGroup>
<Source_Dir_Abs>$(MSBuildProjectDirectory)\$(Source_Dir)</Source_Dir_Abs>
</PropertyGroup>
$(MSBuildProjectDirectory)予約済みプロパティは、常にこの参照を含むスクリプトのディレクトリです。
これも「元の」プロジェクト ファイルに対して相対的であるため、<Import>
ed を取得するファイル内に配置されている場合、これはそのファイルに対して相対的ではありません。