MSBuild使用%(RecursiveDir)作为文件名的一部分

时间:2012-05-30 12:45:42

标签: msbuild msbuild-4.0

作为构建脚本的一部分,我们从子目录中复制用户消息文件,并希望将子目录的名称附加到消息文件中。 即msg \ 0 \ message.std> MSG \ message0.std

我尝试过使用

<Copy SourceFiles="@(MessageFiles)" 
DestinationFiles="@(MessageFiles->'$(BuildRoot)\%(Filename)%(RecursiveDir)%(Extension)'"/>

但是,这会尝试将文件复制到.. \ message0.std。

无论如何要么抑制来自%(RecursiveDir)的尾随'\',要么用另一种方式组成目的地名称?

1 个答案:

答案 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