作为构建脚本的一部分,我们从子目录中复制用户消息文件,并希望将子目录的名称附加到消息文件中。 即msg \ 0 \ message.std> MSG \ message0.std
我尝试过使用
<Copy SourceFiles="@(MessageFiles)"
DestinationFiles="@(MessageFiles->'$(BuildRoot)\%(Filename)%(RecursiveDir)%(Extension)'"/>
但是,这会尝试将文件复制到.. \ message0.std。
无论如何要么抑制来自%(RecursiveDir)的尾随'\',要么用另一种方式组成目的地名称?
答案 0 :(得分:4)
您可以执行以下操作:
<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。