ファイルにリストされている単一のプロパティの候補となるすべてのプロパティが事前にわかっている場合は、アイテム フィルタリングを使用してこれを行う方法があります。警告:
1) プロパティ関数を使用して文字列を解析する場合を除き、$(PropertyName) ではなく、ファイルに PropertyName のみを指定します。
2)以下のアプローチでは、ファイルに 1 行しか存在できません。複数行の場合は、追加のレベルのバッチ処理が必要になります。
<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) の 2 つの候補プロパティを確立します。この例では、property.txt の内容は 1 行でした...
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>
上記は、以下のメイン ターゲットの 2 つの依存ターゲットです。@(ChooseProperty) アイテム グループのターゲット バッチ処理で使用されるアイテム グループにパブリッシュされるように、依存ターゲットを使用してファイルを読み取ります。注意すべき重要なことは、これにより、単一のメンバーを含む @(_FilteredItems) 項目グループの作成条件です...
Condition="'$(_ItemFromFile)' == '$(_ThisProperty)'
...条件を機能させるために、バッチ処理されたアイテムのメタデータがこれらの一時的なプロパティに転送されることに注意してください (これが、ファイルに 1 行のみを含めることができるため、アイテムが 1 つだけになる理由です)。
<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'
「SomeOtherProperty」を含むように property.txt を変更すると、次のようになります。
ChoosePropertyFromItem:
LastLine='2'