您可以执行以下操作:
<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 属性函数博客文章
中找到更多信息。
作为处理问题的另一种方法,您始终可以创建自定义任务。