MSBuild:如何在给定绝对路径的情况下获取文件的相对路径?

9

我有这样一个情况,我有一堆绝对路径,我想根据另一个目录使用MSBuild将它们转换为相对路径。以下是我目前的代码:

<PropertyGroup>
    <FromPath>$(Bar)</FromPath>
</PropertyGroup>
<ItemGroup>
    <AbsolutePaths Include="@(Foo)" Exclude="@(Baz)" />
    <PathsRelativeToBar Include="@(AbsolutePaths->'???')" /> <!-- What goes here? -->
</ItemGroup>

希望能得到任何帮助,谢谢!

编辑:我在this StackOverflow问题中找到了一个基于C#的解决方案,但我不确定如何(或是否可能)将其转换为MSBuild。


如果你有绝对路径和相对工作目录路径,这个链接可能会有所帮助: https://dev59.com/wHRB5IYBdhLWcg3wJkhC - mojorisinify
@mojorisinify 感谢您的帮助!我已经看到了那个解决方案。不幸的是,我不太确定如何将其转换为MSBuild代码。 - James Ko
1个回答

17

在MSBuild中有一个名为"MakeRelative"的原生函数。

以下是如何使用它的方法。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.5" >
    <PropertyGroup>
        <Bar>c:\temp\msbuild-sample\2</Bar>
        <FromPath>$(Bar)</FromPath>
    </PropertyGroup>
    <ItemGroup>
        <AbsolutePaths Include="c:\temp\msbuild-sample\1\**\*.txt" />
    </ItemGroup>
    <Target Name="Build">
        <ItemGroup>
            <PathsRelativeToBar Include="@(AbsolutePaths)">
                <!-- Here is the magic... we're adding a piece of metadata with the relative path -->
                <RelativePath>$([MSBuild]::MakeRelative($(FromPath), %(AbsolutePaths.FullPath)))</RelativePath>
            </PathsRelativeToBar>
        </ItemGroup>
        <Message Text="----- Absolute paths -----" />
        <Message Text="%(AbsolutePaths.FullPath)" />
        <Message Text="----- Relative paths (showing full path) -----" />
        <Message Text="%(PathsRelativeToBar.FullPath)" />
        <Message Text="----- Relative paths (relative to $(FromPath)) -----" />
        <Message Text="%(PathsRelativeToBar.RelativePath)" />
    </Target>
</Project>

这是我当前环境的快速视图。

C:\temp\msbuild-sample>dir /s /b

C:\temp\msbuild-sample\1
C:\temp\msbuild-sample\sample.build
C:\temp\msbuild-sample\1\1.1
C:\temp\msbuild-sample\1\1.txt
C:\temp\msbuild-sample\1\2.txt
C:\temp\msbuild-sample\1\1.1\3.txt
C:\temp\msbuild-sample\1\1.1\4.txt

这里是输出结果。

----- Absolute paths -----
c:\temp\msbuild-sample\1\1.1\3.txt
c:\temp\msbuild-sample\1\1.1\4.txt
c:\temp\msbuild-sample\1\1.txt
c:\temp\msbuild-sample\1\2.txt
----- Relative paths (showing full path) -----
c:\temp\msbuild-sample\1\1.1\3.txt
c:\temp\msbuild-sample\1\1.1\4.txt
c:\temp\msbuild-sample\1\1.txt
c:\temp\msbuild-sample\1\2.txt
----- Relative paths (relative to c:\temp\msbuild-sample\2) -----
..\1\1.1\3.txt
..\1\1.1\4.txt
..\1\1.txt
..\1\2.txt
希望这有所帮助 :)

Hope this helps :)


太棒了,非常有帮助的答案!我从来不知道那个函数。 - James Ko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接