#.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>