MSBuild получает подстроку свойств перед символом подчеркивания

В MSBuild у меня есть свойство, значение которого Name_Something. Как я могу получить часть имени этого свойства.

Ответы

Ответ 1

С MSBuild 4

Если вы используете MSBuild 4, вы можете использовать новые и блестящие функции свойств .

<PropertyGroup>
  <MyProperty>Name_Something</MyProperty>
</PropertyGroup>

<Target Name="SubString">
  <PropertyGroup>
    <PropertyName>$(MyProperty.Substring(0, $(MyProperty.IndexOf('_'))))</PropertyName>
  </PropertyGroup>

  <Message Text="PropertyName: $(PropertyName)"/>
</Target>

С MSBuild < 4

Вы можете использовать задачу RegexReplace Задача сообщества MSBuild

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

Ответ 2

Если я правильно понял ваш вопрос, вы пытаетесь получить подстроку свойства MSBuild. Прямого способа выполнения строковых манипуляций в MSBuild нет, например, в NAnt. Таким образом, у вас есть два варианта:

1). Создайте отдельные переменные для каждой части и объедините их:

<PropertyGroup>
  <Name>Name</Name>
  <Something>Something</Something>
  <Combined>$(Name)_$(Something)</Combined>
</PropertyGroup>

Это прекрасно работает, если детали известны до того, как вы это сделаете, но не нужно, если вам нужно сделать это динамически.

2). Напишите задачу клиента MSBuild, которая выполняет манипуляции с строкой. Это будет вашим единственным вариантом, если это нужно сделать во время выполнения.

Ответ 3

Похоже, вы могли бы использовать Item MetaData​​strong > вместо свойства:

<ItemGroup>
    <Something Include="SomeValue">
        <Name>YourName</Name>
        <SecondName>Foo</SecondName>
    </Something>
</ItemGroup>