Если вы заранее знаете все свойства, которые являются кандидатами на то, чтобы быть единственным свойством, перечисленным в файле, есть способ сделать это с помощью фильтрации элементов.Предостережения:
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
..., что соответствует $ (SomeProperty) со значением 1
<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'