次のようなことができます。
<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 プロパティ関数のブログ投稿を参照してください。
問題を処理する別の方法として、いつでもCustom Taskを作成できます。