在 csproj 节点中获取通配符引用

Get wildcard reference in csproj node

举个例子:

<EmbeddedResource Include="Resources\files\main-*.png">
   <LogicalName>Images\main\???.resources</LogicalName>
</EmbeddedResource>

如何从节点的子节点中获取“*”部分?我找到了 %Filename%,但这太多了。

可以,但需要一些property functions功夫。

<Project>
    <!--
        Create files:
        Resources\files\main-foo.png
        Resources\files\main-bar.png

        Run:
        MSBuild.exe foo.proj /t:Test

        Output:
        LogicalName: Images\main\foo.resources
        LogicalName: Images\main\bar.resources
    -->

    <ItemGroup>
        <EmbeddedResource Include="Resources\files\main-*.png">
            <_DashPosition>$([System.String]::Copy('%(FileName)').IndexOf('-'))</_DashPosition>
            <_LogicalNameStart>$([MSBuild]::Add(%(_DashPosition), 1))</_LogicalNameStart>
            <LogicalName>Images\main$([System.String]::Copy('%(FileName)').Substring(%(_LogicalNameStart))).resources</LogicalName>
        </EmbeddedResource>
    </ItemGroup>

    <Target Name="Test">
        <Message Text="LogicalName: %(EmbeddedResource.LogicalName)" Importance="high"/>
    </Target>

</Project>

一般的方法就像在 C# 或其他语言中一样。找到分隔符(这里是文件名中的 -)并将其后的所有内容作为 LogicalName.

请注意,我使用了“临时”项目元数据(“_”只是此处的约定)以使事情更加清晰。从理论上讲,您可以将所有东西塞进 <LogicalName> 本身。