2011-09-15 49 views
6

我想知道如何使用MSBuild同步兩個文件夾,包括子文件夾。使用MSBUILD同步兩個文件夾

我喜歡做的是

一)從源文件夾中的所有文件複製到文件夾DEST是新 或DEST文件夾不存在

二)以去除 源文件夾中的不存在的(再在DEST文件夾中的所有文件)

a)是使用很容易任務但我該如何完成b)?

這是迄今爲止我的生成文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="4.0" 
    DefaultTargets="Backup"> 
    <PropertyGroup> 
     <SourceFolder>C:\source</SourceFolder> 
     <DestFolder>C:\dest</DestFolder> 
    </PropertyGroup> 
    <ItemGroup> 
     <FilesToCopy Include="$(SourceFolder)\**" /> 
    </ItemGroup> 
    <Target Name="Backup"> 
     <!-- copy all files from the source folder to the dest folder 
      that are newer or don't exist in the dest folder --> 
     <Copy 
      SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="True" /> 
     <!-- TODO: remove all files from the dest folder 
      that don't exist in the source folder --> 
    </Target> 
</Project> 

回答

4

您可以用MSBuild Extension packGetDistinctItems任務去做。 其基本思想是從源文件夾和目標文件夾中獲取不同的文件。

<Project ToolsVersion="3.5" DefaultTargets="Default" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks" /> 

    <PropertyGroup> 
    <SourceFolder>C:\source</SourceFolder> 
    <DestFolder>C:\dest</DestFolder> 
    </PropertyGroup> 

    <ItemGroup> 
    <FilesToCopy Include="$(SourceFolder)\**" /> 
    </ItemGroup> 

    <Target Name="Backup"> 
    <!-- copy all files from the source folder to the dest folder 
        that are newer or don't exist in the dest folder --> 
    <Copy SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="True" /> 

    <!-- Remove all files from the dest folder 
      that don't exist in the source folder --> 
    <ItemGroup> 
     <DestFiles Include="$(DestFolder)\**"/> 
    </ItemGroup> 

    <!-- Cannot compare FilesToCopy with DestFiles directly, 
     root folders are different--> 
    <ItemGroup> 
     <SrcFilesLeave Include="%(FilesToCopy.RecursiveDir)%(FilesToCopy.Filename)%(FilesToCopy.Extension)"/> 
     <DestFilesLeave Include="%(DestFiles.RecursiveDir)%(DestFiles.Filename)%(DestFiles.Extension)"/> 
    </ItemGroup> 

    <MSBuild.ExtensionPack.Framework.MsBuildHelper TaskAction="GetDistinctItems" 
                InputItems1="@(SrcFilesLeave)" 
                InputItems2="@(DestFilesLeave)"> 
     <Output TaskParameter="OutputItems" ItemName="Distinct"/> 
    </MSBuild.ExtensionPack.Framework.MsBuildHelper> 

    <Message Text="Distinct %(Distinct.Identity)"/> 
    <Delete Files="$(DestFolder)\%(Distinct.Identity)" /> 
    </Target> 

</Project> 
+1

行之有效!我安裝了MSBuild-Extensions,並在構建文件中添加了' – miasbeck

1

可以使用MSDeploy工具中的MSBuild兩個文件夾,這樣的同步:

<Target Name="SynchronyzeFolders"> 
    <PropertyGroup> 
    <_MSDeploySrc>contentPath=C:\inetpub\Dir1\</_MSDeploySrc> 
    <_MSDeployDest>contentPath=C:\inetpub\Dir2\,computerName='https://$(RemoteComputerName):8172/MSDeploy.axd',userName='$(MSDeployUsername)',password='$(MSDeployPassword)',authtype='$(MSDeployAuth)'</_MSDeployDest> 
    <_MSDeployParameters>-verb:$(MSDeployVerb) -source:$(_MSDeploySrc) -dest:$(_MSDeployDest) $(MSDeployAdditionalParams)</_MSDeployParameters> 
    </PropertyGroup> 

    <Exec Command="msdeploy $(_MSDeployParameters)" 
     CustomErrorRegularExpression="ERROR"/> 

文件夾可無論是在相同或不同的計算機上。文件夾的路徑可以包含本地和網絡路徑。等等。您可以同步IIS WebSites以及文件夾。只要使用不同的MSDeploy提供商:http://technet.microsoft.com/en-us/library/dd569040(v=ws.10).aspx 幫助配置Web部署處理程序:http://www.iis.net/learn/publish/using-web-deploy/configure-the-web-deployment-handler

2

如果有人不想或無法安裝擴展包

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="4.0" 
    DefaultTargets="Backup"> 
    <PropertyGroup> 
     <SourceFolder>C:\source</SourceFolder> 
     <DestFolder>C:\dest</DestFolder> 
    </PropertyGroup> 
    <ItemGroup> 
     <FilesToCopy Include="$(SourceFolder)\**" /> 
    </ItemGroup> 
    <Target Name="Backup"> 
     <!-- copy all files from the source folder to the dest folder 
      that are newer or don't exist in the dest folder --> 
     <Copy 
      SourceFiles="@(FilesToCopy)" 
      DestinationFiles="@(FilesToCopy->'$(DestFolder)\%(RecursiveDir)%Filename)%(Extension)')" 
      SkipUnchangedFiles="True"> 
      <Output TaskParameter="CopiedFiles" ItemName="Copied"/> 
     </Copy> 
     <ItemGroup> 
      <OutdatedFiles Include="$(DestFolder)\**" Exclude="@(Copied)"/> 
     </ItemGroup> 
     <Delete Files="@(OutdatedFiles)"/> 
    </Target> 
</Project>