당신은 다음과 같이 할 수있다 : 당신은 당신의 일을 유지하기 위해 노력할 것이다 사람의 마음을 날려하고자하는 경우
<Target Name="DoIt">
<ItemGroup>
<MessageFiles2 Include="@(MessageFiles)">
<SubDir>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetDirectoryName(%(MessageFiles.RecursiveDir)))))</SubDir>
</MessageFiles2>
</ItemGroup>
<Message Text="@(MessageFiles2->'$(BuildRoot)\%(Filename)%(SubDir)%(Extension)')"/>
</Target>
또는 :
<Target Name="DoIt">
<Message Text="@(MessageFiles->'$(BuildRoot)\%(Filename)$([System.IO.Path]::GetFileName($([System.IO.Path]::GetDirectoryName($([System.String]::Copy('%(MessageFiles.RecursiveDir)'))))))%(Extension)')"/>
</Target>
이되지 않습니다 완벽한 솔루션이지만 여기에서 시작할 수 있습니다. RecursiveDir
이 비어있는 경우 즉, 메시지 파일이 루트 폴더에 직접있는 경우 위의 두 예 모두 중단됩니다.
자세한 내용은 MSBuild Property Functions 블로그 게시물에서 확인할 수 있습니다.
문제를 처리하는 또 다른 방법으로 항상 Custom Task을 만들 수 있습니다.