MSBuild在下划线符号之前获取属性子字符串

时间:2010-06-22 15:13:31

标签: msbuild

在MSBuild中,我有一个属性,其值为Name_Something。我怎样才能将此名称作为此属性的一部分。

3 个答案:

答案 0 :(得分:33)

使用MSBuild 4

如果您使用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&lt; 4

您可以使用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>

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