копирование списка файлов с разделителями с помощью MSBuild

#.net #asp.net #msbuild

#.net #asp.net #msbuild

Вопрос:

У меня есть строковое значение, которое в properygroup считывается из config.xml файл, который выводится как «c:testfile1 ;c:test2file2 «мне нужно скопировать этот список в папку назначения с помощью MSBuild, как я могу этого добиться?

 <Target Name="CopyFiles">  
    <ItemGroup>
        <FilesToCopy 
            Include="@(filesToCopy)"                 
            Exclude="***trash*"/>
    </ItemGroup>
    <Copy SourceFiles="@(filesToCopy)"          
         DestinationFiles="@(filesToCopy->'$(Dest)%(RecursiveDir)%(Filename)%(Extension)')"          
         ContinueOnError="true"/></Target>
  

в приведенном выше коде @filesToCopy включает список файлов, разделенных запятыми.

Комментарии:

1. Вы заметили синтаксическую ошибку? приведенный выше код «Include=»@filesToCopy»» должен быть «Include=»@(filesToCopy)»»

2. да, ошибка при копировании по-прежнему не найдено решения для этого

3. @DSharper : есть какие-либо обновления по этому поводу с 2011 года?

Ответ №1:

Вы не должны заботиться о точке с запятой в качестве разделителя. Задача копирования MSBuild в этом случае работает корректно.

Это показано в примере документации MSDN:

 <ItemGroup>
    <MySourceFiles Include="a.cs;b.cs;c.cs"/>
</ItemGroup>

<Target Name="CopyFiles">
    <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFolder="c:MyProjectDestination"
    />
</Target>
  

из объяснения задачи копирования MSDN

Комментарии:

1. @anton-k, не работает, он жалуется на копирование всех файлов как одного имени файла (т. Е. «a.cs; b.cs; c.cs» все как имя файла)

2. @anton-k, ваш код работает, если ввод содержит жестко закодированные имена файлов, но, пожалуйста, смотрите выше мой код, я хочу включить =»@(FilestoCopy)», которые представляют собой список динамических файлов. когда я пытаюсь скопировать все файлы как один файл, они фактически считываются из xml-файла.

Ответ №2:

Если речь идет об экранировании точки с запятой, вам бы хотелось экранировать ее с помощью ;, обратитесь сюда для получения дополнительной информации

Если вам нужна полная информация, пожалуйста

 <ItemGroup>
      <Compile Include="c:\test\file1.txt;c:\test2\file2.txt" /> 
   </ItemGroup>

<Copy SourceFiles="@(Compile)" DestinationFolder="c:destination%(RecursiveDir)">
</Copy>
  

Комментарии:

1. @Subhash-Dike не повезло, получил эту ошибку MSBUILD: предупреждение MSB3021: Не удается скопировать файл «c:testfile1 ;c:test2file2 » в «Dest2 \GettingAroundAirTaxiDe ccanAviation.aspx.cs». Формат указанного пути не поддерживается.

2. @Subhash-Dike, приведенный выше код anton-k работает только тогда, когда «включить» содержит жестко закодированные пути к именам файлов, но мне нужно, чтобы список файлов поступал из @filesCopy динамически, пожалуйста, смотрите мой код.

Ответ №3:

Обрабатывать filesToCopy как свойство, а не ItemGroup:

 <FilesToCopy Include="$(filesToCopy)" Exclude="***trash*"/>
  

Затем при вызове CopyFiles целевого объекта заполните filesToCopy список файлов с разделителями:

 msbuild CopyFiles.proj /t:CopyFiles /p:filesToCopy="c:testfile1;c:test2file2"
  

или с помощью задачи MSBuild:

 <Target Name="CallCopyFiles">
    <MSBuild Projects="CopyFiles.proj" Properties="filesToCopy=c:testfile1;c:test2file2"/>
</Target>