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 MetaDatastrong > вместо свойства:
<ItemGroup>
<Something Include="SomeValue">
<Name>YourName</Name>
<SecondName>Foo</SecondName>
</Something>
</ItemGroup>