Если вы заранее знаете все свойства, которые являются кандидатами на то, чтобы быть одним свойством, перечисленным в файле, есть способ сделать это с помощью фильтрации элементов. Предостережения:
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'
person
Brian Kretzler
schedule
23.03.2011