如果您事先知道所有作为文件中列出的单个属性的候选属性,则可以通过项目过滤来执行此操作。注意事项:
1) 仅指定文件中的 PropertyName,而不是 $(PropertyName),除非您想使用属性函数解析字符串。
2)使用以下方法,文件中只能有一行,对于多行,您需要额外的批处理级别。
<ItemGroup>
<PropertyFile Include="property.txt" />
</ItemGroup>
<PropertyGroup>
<SomeProperty>1</SomeProperty>
<SomeOtherProperty>2</SomeOtherProperty>
</PropertyGroup>
<ItemGroup>
<ChooseProperty Include="SomeProperty">
<Value>$(SomeProperty)</Value>
</ChooseProperty>
<ChooseProperty Include="SomeOtherProperty">
<Value>$(SomeOtherProperty)</Value>
</ChooseProperty>
</ItemGroup>
上面的构造建立了两个候选属性,$(SomeProperty) 和 $(SomeOtherProperty)。对于此示例,property.txt 的内容是单行...
SomeProperty
...与值为 1 的 $(SomeProperty) 相关
<Target Name="ReadItems">
<ReadLinesFromFile File="@(PropertyFile)">
<Output
TaskParameter="Lines"
ItemName="ItemsFromFile"
/>
</ReadLinesFromFile>
</Target>
<Target Name="FilterItems"
Outputs="%(ChooseProperty.Identity)">
<PropertyGroup>
<_ThisProperty>%(ChooseProperty.Identity)</_ThisProperty>
<_ThisValue>%(ChooseProperty.Value)</_ThisValue>
<_ItemFromFile>%(ItemsFromFile.Identity)</_ItemFromFile>
</PropertyGroup>
<ItemGroup Condition="'$(_ItemFromFile)' == '$(_ThisProperty)'">
<_FilteredItems Include="$(_ThisProperty)">
<Value>$(_ThisValue)</Value>
</_FilteredItems>
</ItemGroup>
</Target>
上面是下面主要目标的两个依赖目标。他们使用从属目标来读取文件,以便将其发布到项目组中,以便与 @(ChooseProperty) 项目组上的目标批处理一起使用。需要注意的关键是 @(_FilteredItems) 项目组的创建条件,该项目组将包含一个成员,因为...
Condition="'$(_ItemFromFile)' == '$(_ThisProperty)'
...请注意,批处理的项目元数据被传输到这些临时属性以使条件起作用(这就是为什么文件只能包含一行,因此只有一个项目)。
<Target Name="ChoosePropertyFromItem"
DependsOnTargets="ReadItems;FilterItems">
<!-- Standard task for file reading -->
<PropertyGroup>
<LastLine>%(_FilteredItems.Value)</LastLine>
</PropertyGroup>
<Message Text="LastLine='$(LastLine)'" />
</Target>
...最后 $(LastLine) 属性是从 @(_FilteredItems) 中的单个项目中提取的。结果输出如下:
ChoosePropertyFromItem:
LastLine='1'
将 property.txt 更改为包含“SomeOtherProperty”会导致:
ChoosePropertyFromItem:
LastLine='2'