Разверните Свойства MSBuild, содержащие подстановочные знаки, в Элементы - PullRequest
4 голосов
/ 29 января 2012

Я пытаюсь написать скрипт MSBuild, который будет выполнять некоторые действия (например, печатать его путь) над произвольными файлами (указанными в качестве свойства в командной строке) в некотором предопределенном каталоге (F: \ Files).

С учетом следующей структуры каталогов

F:\Files\TextFile.txt
F:\Files\Subdir1\ImageFile.bmp
F:\Files\Subdir1\SubSubdir\ImageFile2.bmp
F:\Files\Subdir1\SubSubdir\TextFile2.txt

И MSBuild Script

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <TargetDir>F:\Files</TargetDir>
    </PropertyGroup>

    <ItemGroup>
        <Files Include="$(TargetDir)\$(InputFiles)"/>
    </ItemGroup>

    <Target Name="PrintNames">
        <Message Text="Files: @(Files, ', ')" />
    </Target>
</Project>

запуск сценария с установленным для InputFiles значением "** \ *. Bmp; ** \ *. Txt"отлично работает только для файлов bmp.Txt файлы берутся из текущего рабочего каталога, а не из "F: \ Files"

1 Ответ

7 голосов
/ 30 января 2012

Есть две проблемы, которые вам нужно решить:

  1. $ (InputFiles) указывается как скалярное свойство, но вы хотите интерпретировать его как массив
  2. $ (InputFiles) содержит символы подстановки, которые вы хотите расширить после вы выполняете преобразование в списке шаблонов в $ (InputFiles).

Легко решить любую из двух проблем по отдельности, но комбинация этих двух на самом деле сложно. У меня есть одно возможное решение, и оно работает, но недостатком является то, что вы должны кодировать символы * в определении шаблона.

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
  <PropertyGroup> 
    <TargetDir>c:\temp\MyContent</TargetDir> 
    <InputFilesRelativeEsc>%2A%2A\%2A.bmp;%2A%2A\%2A.txt</InputFilesRelativeEsc>
  </PropertyGroup> 

  <Target Name="PrintNames"> 
    <ItemGroup>
        <_TempGroup Include="$(InputFilesRelativeEsc)" />
    </ItemGroup>

    <CreateItem Include="@(_TempGroup->'$(TargetDir)\%(Identity)')"> 
        <Output TaskParameter="Include" ItemName="_EvaluatedGroup" /> 
    </CreateItem> 
    <Message Text="_EvaluatedGroup: %(_EvaluatedGroup.FullPath)" />

  </Target> 
</Project> 

Работает следующим образом. Свойство InputFilesRelativeEsc представляет собой список относительных шаблонов файлов. Обратите внимание, что символы подстановки кодируются (% 2A является шестнадцатеричным кодом для звездочки). Поскольку подстановочные знаки закодированы, группа _TempGroup не пытается искать и извлекать список файлов, пока вы Include вводите эти шаблоны в эту группу. Теперь _TempGroup - это группа, состоящая из двух элементов: **\*.bmp и **\*.txt. Теперь, когда у вас есть настоящая группа, вы можете преобразовать ее. Единственное осложнение состоит в том, что обычный механизм запуска трансформации MSBuild не расширяет подстановочные знаки. Вы должны использовать более старую задачу CreateItem. Задача CreateItem фактически объявлена ​​устаревшей командой MSBuild, но она все еще работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...