【发布时间】:2011-03-06 21:18:57
【问题描述】:
在 MSBuild 中,我有一个值为 Name_Something 的属性。如何获取此属性的名称部分。
【问题讨论】:
标签: msbuild
在 MSBuild 中,我有一个值为 Name_Something 的属性。如何获取此属性的名称部分。
【问题讨论】:
标签: msbuild
如果您使用 MSBuild 4,则可以使用新的闪亮的property functions。
<PropertyGroup>
<MyProperty>Name_Something</MyProperty>
</PropertyGroup>
<Target Name="SubString">
<PropertyGroup>
<PropertyName>$(MyProperty.Substring(0, $(MyProperty.IndexOf('_'))))</PropertyName>
</PropertyGroup>
<Message Text="PropertyName: $(PropertyName)"/>
</Target>
你可以使用MSBuild Community Task的RegexReplace任务
<PropertyGroup>
<MyProperty>Name_Something</MyProperty>
</PropertyGroup>
<Target Name="RegexReplace">
<RegexReplace Input="$(MyProperty)" Expression="_.*" Replacement="" Count="1">
<Output ItemName ="PropertyNameRegex" TaskParameter="Output" />
</RegexReplace>
<Message Text="PropertyNameRegex: @(PropertyNameRegex)"/>
</Target>
【讨论】:
如果我正确理解您的问题,您正在尝试获取 MSBuild 属性的子字符串。在 MSBuild 中没有直接的方法来进行字符串操作,就像在 NAnt 中一样。所以你有两个选择:
1)。为每个部分创建单独的变量并将它们组合起来:
<PropertyGroup>
<Name>Name</Name>
<Something>Something</Something>
<Combined>$(Name)_$(Something)</Combined>
</PropertyGroup>
如果事先知道这些部件,这可以正常工作,但如果您需要动态执行此操作,则不会。
2)。编写一个执行字符串操作的客户 MSBuild 任务。如果需要在运行时完成,这将是您唯一的选择。
【讨论】:
看起来您可以使用 Item MetaData 代替属性:
<ItemGroup>
<Something Include="SomeValue">
<Name>YourName</Name>
<SecondName>Foo</SecondName>
</Something>
</ItemGroup>
【讨论】: