2016-06-16 5 views
2

Я хочу передать список строк, разделенных запятой.
Каждая строка представляет собой имя файла.msbuild create itemgroup из группы свойств

<PropertyGroup> 
      <FileNames>Newtonsoft.Json;Reactive</FileNames> 
      <PathToOutput>C:/</PathToOutput> 
    </PropertyGroup> 

Теперь я хочу, чтобы создать группу элементов, которые должны дать мне все файлы в определенной папке без учета списка Имя файла, что-то вроде:

<ItemGroup> 
    <ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="%(identity)-> identity.contains(%FileNames)"/> 
</ItemGroup> 

Как перебирать файлы текущей папки и матча каждый из них, если он содержит какое-либо имя файла в переменной Filenames.

ответ

1

Довольно уверен, что это дубликат, но я не могу найти его в тот момент, так что здесь идет:

  • поворота свойства точкой с запятой-отделено в элемент является лишь вопросом использования Include=$(Property)
  • Exclude только работает, если у вас есть список точных совпадений, но здесь вам нужна более произвольная фильтрация, поэтому вам понадобится Condition.
  • соединяйте две группы элементов вместе как кросс-продукт, создав эти метаданные FileNames элемента ReleaseFiles. Затем вы можете перебирать каждый элемент в ReleaseFiles и одновременно иметь доступ к FileNames.
  • Contains - это функция свойства (ну или метод System :: String), поэтому она не будет работать как таковая в метаданных, поэтому мы включить метаданные в строку первой

в коде:

<PropertyGroup> 
    <FileNames>Newtonsoft.Json;Reactive</FileNames> 
    <PathToOutput>C:/</PathToOutput> 
</PropertyGroup> 

<Target Name="FilterBasedCommaSeperatedProperty"> 
    <ItemGroup> 
    <!-- property -> item --> 
    <Excl Include="$(FileNames)"/> 
    <!-- list all and add metadata list --> 
    <AllReleaseFiles Include="$(PathToOutput)\**\*.*"> 
     <Excl>%(Excl.Identity)</Excl> 
    </AllReleaseFiles > 
    <!-- filter to get list of files we don't want --> 
    <FilesToExclude Include="@(AllReleaseFiles)" 
        Condition="$([System.String]::Copy('%(FileName)').Contains('%(Excl)'))"/> 
    <!-- all but the ones to exclude --> 
    <ReleaseFiles Include="@(AllReleaseFiles)" Exclude="@(FilesToExclude)"/> 
    </ItemGroup> 
    <Message Text="%(ReleaseFiles.Identity)" /> 
</Target> 
+0

вы имели в виду, чтобы написать «точкой с запятой», а не «разделенный запятыми»? –

+0

@ DanMalcolm исправил это, спасибо – stijn

0

Используйте стандартный способ, чтобы исключить файлы из файлов элементов в группе, используя атрибут Исключить и ссылки другой группы товаров. Это будет намного легче понять.

Пример:

<PropertyGroup> 
    <PathToOutput>C:/</PathToOutput> 
</PropertyGroup> 

<ItemGroup> 
    <FilesToExclude Include="$(PathToOutput)\**\Newtonsoft.Json" /> 
    <FilesToExclude Include="$(PathToOutput)\**\Reactive" /> 
    <ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="@(FilesToExclude)"/> 
</ItemGroup> 
Смежные вопросы