在MSBuild中,我有一个属性,其值为Name_Something。我怎样才能将此名称作为此属性的一部分。
答案 0 :(得分:33)
如果您使用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>
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>
答案 1 :(得分:-3)
如果我正确理解了您的问题,那么您正在尝试获取MSBuild属性的子字符串。没有直接的方法在MSBuild中进行字符串操作,就像在NAnt中一样。所以你有两个选择:
1)。为每个零件创建单独的变量并将它们组合起来:
<PropertyGroup>
<Name>Name</Name>
<Something>Something</Something>
<Combined>$(Name)_$(Something)</Combined>
</PropertyGroup>
如果部件事先已知,则可以正常工作,但如果需要动态执行此操作则不行。
2)。编写一个执行字符串操作的客户MSBuild任务。如果需要在运行时完成,这将是您唯一的选择。
答案 2 :(得分:-4)
看起来你可以使用 Item MetaData 而不是Property:
<ItemGroup>
<Something Include="SomeValue">
<Name>YourName</Name>
<SecondName>Foo</SecondName>
</Something>
</ItemGroup>