Пакетная рекурсивная копия папки MSbuild в несколько папок назначения

Я столкнулся с ситуацией. Я пытаюсь использовать пакетную обработку MSBuild, чтобы скопировать папку (подкаталоги, а также файлы) для искажения папок назначения. но когда я запускаю приведенный ниже сценарий, он выгружает все содержимое из src (содержимое из подкаталогов тоже) в корневой целевой каталог, тогда как то, что я искал, заключалось в том, чтобы получить ту же структуру, что и в src в целевых каталогах.

<PropertyGroup>
        <Srcfldr>C:\helloworld\REService</Srcfldr>
    <DestFldr>C:\Projects\desire\Examples</DestFldr>
  </PropertyGroup>

  <ItemGroup>
    <SrcToCopy Include="$(Srcfldr)\*.*"/>
  </ItemGroup>

  <ItemGroup>
    <DestToCopy Include="$(DestFldr)/destfldr1"/>
    <DestToCopy Include="$(DestFldr)/destfldr2"/>
    <DestToCopy Include="$(DestFldr)/destfldr3"/>

  </ItemGroup>

   <Target Name="DeployBatching">
    <RemoveDir Directories="@(DestToCopy)"/>
    <MakeDir Directories="@(DestToCopy)"/>

    <Copy SourceFiles="@(SrcToCopy)" DestinationFolder="%(DestToCopy.FullPath)" />

Подскажите, пожалуйста, что я делаю не так ...

SK


person AnsibleUser    schedule 11.08.2014    source источник


Ответы (3)


Обычная задача копирования лучше подходит для копирования файлов, а не каталогов, в любом случае, чтобы сохранить структуру, вам нужно переназначить место назначения, используя метаданные %(RecursiveDir) и %(Filename)%(Extension). См. второй пример в MSDN.

Редактировать:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Srcfldr>C:\helloworld\REService</Srcfldr>
        <DestFldr>C:\Projects\desire\Examples</DestFldr>
    </PropertyGroup>

    <ItemGroup>
        <SrcToCopy Include="$(Srcfldr)\**\*"/>
    </ItemGroup>

    <ItemGroup>
        <DestToCopy Include="$(DestFldr)\destfldr1"/>
        <DestToCopy Include="$(DestFldr)\destfldr2"/>
        <DestToCopy Include="$(DestFldr)\destfldr3"/>
    </ItemGroup>

    <Target Name="DeployBatching" Outputs="%(DestToCopy.FullPath)">
        <PropertyGroup>
            <DestToCopy>%(DestToCopy.FullPath)</DestToCopy>
        </PropertyGroup>
        <RemoveDir Directories="@(DestToCopy)"/>
        <MakeDir Directories="@(DestToCopy)"/>
        <Copy
            SourceFiles="@(SrcToCopy)"
            DestinationFiles="@(SrcToCopy->'$(DestToCopy)\%(RecursiveDir)\%(Filename)%(Extension)')"
        />
    </Target>
</Project>
person Ilya Kozhevnikov    schedule 11.08.2014
comment
Не похоже, что это работает для меня ... Я попробовал следующий код ‹PropertyGroup› ‹DestToCopyvar›% (DestToCopy) ‹/DestToCopyvar› ‹/PropertyGroup› ‹Target Name = DeployBatching› ‹Copy SourceFiles = @ (SrcToCopy) DestinationFiles = @ (SrcToCopy - ›'$ (DestToCopyvar) \% (RecursiveDir)% (Имя файла)% (Расширение)') /› - person AnsibleUser; 12.08.2014
comment
Он копирует только корневые файлы в корневой каталог, в нем отсутствуют каталоги и подкаталоги ... - person AnsibleUser; 12.08.2014
comment
@Satesh $(Srcfldr)\**\* здесь ** означает на любом уровне, и это то, для чего %(RecursiveDir). Внимательно прочтите пример. - person Ilya Kozhevnikov; 12.08.2014
comment
да, копирование в одну целевую папку работает, но копирование в несколько целевых папок из одного источника истины для меня все еще является проблемой - person AnsibleUser; 12.08.2014
comment
почему-то комментарий пропал .. да, все заработало как положено. Спасибо @llYa - person AnsibleUser; 19.08.2014
comment
@llYa ... был быстрый вопрос ... если у меня есть несколько целевых серверов с 1 источником истины для копирования, но мне нужно добавить путь к имени целевого сервера, тогда мне нужно использовать право массива ... т.е. Например, ‹destsrv› dev1 dev2 ‹destsrv›, но при копировании мне нужно поместить на отдельный сервер dev1 \ fldr1 \ fldr2 и то же самое на dev2 \ fldr1, fldr2. Я должен иметь возможность сделать это в @ (destsrv) правильно, но я не могу добавить эти пути к папкам - person AnsibleUser; 26.08.2014

Не похоже, что он работает так, как я хотел ... Я попробовал приведенный ниже код

<PropertyGroup>
        <Srcfldr>C:\helloworld\REService</Srcfldr>
    <DestFldr>C:\Projects\desire\Examples</DestFldr>
  </PropertyGroup>

  <ItemGroup>
    <SrcToCopy Include="$(Srcfldr)\*.*"/>
  </ItemGroup>

  <ItemGroup>
    <DestToCopy Include="$(DestFldr)/destfldr1"/>
    <DestToCopy Include="$(DestFldr)/destfldr2"/>
    <DestToCopy Include="$(DestFldr)/destfldr3"/>

  </ItemGroup>

<PropertyGroup>
        <DestToCopyvar>%(DestToCopy)</DestToCopyvar>
      </PropertyGroup>

        <Target Name="DeployBatching">

          <Copy SourceFiles="@(SrcToCopy)" DestinationFiles="@(SrcToCopy->'$(DestToCopyvar)\%(RecursiveDir)%(Filename)%(Extension)')" />

Он копирует только корневые файлы в корневой каталог, в нем отсутствуют каталоги и подкаталоги вместе ...

person AnsibleUser    schedule 11.08.2014

Кажется, теперь это работает для меня ...

<PropertyGroup>
<Srcfldr>C:\Msbuild\exproj\Rebinaries</Srcfldr>
<copyfldr>c$\component1</copyfldr>
</PropertyGroup>

<ItemGroup>
<SrcToCopy Include="$(Srcfldr)\**\*"/>
</ItemGroup>

 <ItemGroup>
 <DestToCopy Include="\\devsvr1\$(copyfldr);\\devsvr2\$(copyfldr)"/>
 </ItemGroup>

 <Target Name="DeployBatching" Outputs="%(DestToCopy.FullPath)">
    <PropertyGroup>
        <DestToCopy>%(DestToCopy.FullPath)</DestToCopy>
    </PropertyGroup>
    <RemoveDir Directories="@(DestToCopy)"/>
    <MakeDir Directories="@(DestToCopy)"/>
    <Copy
        SourceFiles="@(SrcToCopy)"
        DestinationFiles="@(SrcToCopy->'$(DestToCopy)\%(RecursiveDir)\%(Filename)%(Extension)')"
    />
</Target>
person AnsibleUser    schedule 26.08.2014