msbuild - 如何删除属性中的字符串

时间:2017-11-20 16:51:50

标签: msbuild

如果我有

<PropertyGroup>
  <Prop1>C:\asdfsa\abc;C:\sadf\def;C:\asfddsa\abc;</Prop1>
</PropertyGroup>

如何删除包含\abc的所有条目?

我希望$(Prop1)的最终值为C:\sadf\def

1 个答案:

答案 0 :(得分:1)

一个属性没有条目,它只是一个字符串。您可以摆弄字符串拆分和/或正则表达式来删除它中的某些部分。另一方面,MSBuild也有更像正确列表的项目。通过他们可能更容易:

<Target Name="RemoveItemsFromProperty">
  <PropertyGroup>
    <Prop1>C:\asdfsa\abc;C:\sadf\def;C:\asfddsa\abc;</Prop1>
  </PropertyGroup>
  <ItemGroup>
    <Items Include="$(Prop1)"/>
    <FilteredItems Include="@(Items)" Condition="! $([System.String]::Copy('%(Identity)').Contains('\abc'))"/>
  </ItemGroup>
  <PropertyGroup>
    <Prop1>@(FilteredItems)</Prop1>
  </PropertyGroup>
  <Message Text="$(Prop1)" />
</Target>

编辑确定正则表达方式更容易,但我并非100%确定我的模式涵盖了所有情况:

<Target Name="RemoveItemsFromProperty">
  <PropertyGroup>
    <Prop1>C:\asdfsa\abc;C:\sadf\def;C:\asfddsa\abc;</Prop1>
  </PropertyGroup>
  <Message Text="$([System.Text.RegularExpressions.Regex]::Replace('$(Prop1)', ';[.^;]\\abc', ''))" />
</Target>