【问题标题】:Trying to exclude certain extensions doing a recursive copy (MSBuild)尝试排除某些扩展执行递归复制 (MSBuild)
【发布时间】:2015-08-28 21:39:35
【问题描述】:

我正在尝试使用 MSBuild 从文本文件中读取文件列表,然后执行递归复制,将这些目录文件的内容复制到某个暂存区域,同时排除某些扩展名 em>(例如 .tmp 文件)

我已经设法使用 CreateItem 和 MSBuild 复制任务很容易地完成了上述大部分工作,无论我做什么 CreateItem 任务都会忽略我的 Exclude 参数:

<PropertyGroup>
  <RootFolder>c:\temp</RootFolder>
  <ExcludeFilter>*.tmp</ExcludeFilter>
  <StagingDirectory>staging</StagingDirectory>
</PropertyGroup>
<ItemGroup>
  <InputFile Include="MyFile.txt" />
</ItemGroup>

<Target Name="Build">
  <ReadLinesFromFile File="@(InputFile)">
    <Output ItemName="AllFolders" TaskParameter="Lines" />
  </ReadLinesFromFile>

  <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
              Exclude="$(ExcludeFilter)">
    <Output ItemName="AllFiles" TaskParameter="Include" />
  </CreateItem>

  <Copy SourceFiles="@(AllFiles)"
        DestinationFolder="$(StagingDirectory)\%(RecursiveDir)" 

“MyFile.txt”的示例内容:

somedirectory\
someotherdirectory\

(即路径与 $(RootFolder) 相关 - 提及这一点是因为我在某处读到它可能相关)

我尝试了很多不同的排除过滤器组合,但我似乎永远无法让它正确排除我的 .tmp 文件 - 有没有任何方法可以在不借助 xcopy 的情况下使用 MSBuild 做到这一点?

【问题讨论】:

    标签: msbuild createitem


    【解决方案1】:

    您必须在绝对路径中指定Exclude,并将排除通配符更改为包含子目录

    如果您对Include 使用绝对路径,则必须对Exclude 使用绝对路径。如果您对Include 使用相对路径,则必须对两者都使用相对路径。

    <PropertyGroup>
      <RootFolder>c:\temp</RootFolder>
      <ExcludeFilter>**\*.tmp</ExcludeFilter>
      <StagingDirectory>staging</StagingDirectory>
    </PropertyGroup>
    <ItemGroup>
      <InputFile Include="MyFile.txt" />
    </ItemGroup>
    
    <Target Name="Build">
      <ReadLinesFromFile File="@(InputFile)">
        <Output ItemName="AllFolders" TaskParameter="Lines" />
      </ReadLinesFromFile>
    
      <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**"
                  Exclude="$(RootFolder)\%(AllFolders.RelativeDir)$(ExcludeFilter)">
        <Output ItemName="AllFiles" TaskParameter="Include" />
      </CreateItem>
    
      <Copy SourceFiles="@(AllFiles)"
            DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
    </Target>
    

    多重排除和绝对路径

    如果你想排除多个项目,使用绝对路径时没有干净的方法,但你可以使用Remove

    第一种方式:使用 Remove 和 item

    <PropertyGroup>
      <RootFolder>c:\temp</RootFolder>
    </PropertyGroup>
    
    <ItemGroup>
      <InputFile Include="MyFile.txt" />
      <!-- Exclude are defined here -->
      <ExcludeFilters Include="$(RootFolder)\**\*.tmp"/>
      <ExcludeFilters Include="$(RootFolder)\**\*.bmp"/>
    </ItemGroup>
    
    <Target Name="Build">
      <ReadLinesFromFile File="@(InputFile)">
        <Output ItemName="AllFolders" TaskParameter="Lines" />
      </ReadLinesFromFile>
    
      <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
        <Output ItemName="AllFiles" TaskParameter="Include" />
      </CreateItem>
    
      <!-- Removing the wrong extension in item -->
      <ItemGroup>
        <AllFiles Remove="@(ExcludeFilters)"/>
      </ItemGroup>
    
      <Copy SourceFiles="@(AllFiles)"
            DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
    </Target>
    

    第二种方式:使用移除和条件

    <Target Name="Build">
      <ReadLinesFromFile File="@(InputFile)">
        <Output ItemName="AllFolders" TaskParameter="Lines" />
      </ReadLinesFromFile>
    
      <CreateItem Include="$(RootFolder)\%(AllFolders.RelativeDir)**">
        <Output ItemName="AllFiles" TaskParameter="Include" />
      </CreateItem>
    
      <!-- Removing the wrong extension in item -->
      <ItemGroup>
        <AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.tmp'"/>
        <AllFiles Remove="@(AllFiles)" Condition="'%(Extension)' == '.bmp'"/>
      </ItemGroup>
    
      <Copy SourceFiles="@(AllFiles)"
            DestinationFolder="$(StagingDirectory)\%(RecursiveDir)"/>
    </Target>
    

    【讨论】:

    • 如果我想列出多个排除过滤器怎么样,例如**\\*.tmp;**\\*.bmp;
    • 感谢您发布多种方式!这种移除技术正是医生所要求的!
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多