【问题标题】:Msbuild - how to delete folder contents but not folder itself?Msbuild - 如何删除文件夹内容而不是文件夹本身?
【发布时间】:2013-02-27 10:31:22
【问题描述】:

现在我的 msbuild 脚本中有一个删除文件夹的任务

<RemoveDir Directories="$(Bin)"/>

但我宁愿删除文件夹的 contents,但保留该文件夹(以防有人在 Windows 资源管理器中打开该文件夹)。我该怎么做?

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    这将删除所有文件和子文件夹:

        <Target Name="CleanFolder">
    
        <PropertyGroup>
          <TargetFolder>c:\clean</TargetFolder>
        </PropertyGroup>
    
        <ItemGroup>
          <FilesToClean Include="$(TargetFolder)\**\*"/>
          <Directories Include="$([System.IO.Directory]::GetDirectories('$(TargetFolder)', '*', System.IO.SearchOption.AllDirectories))"
                       Exclude="$(TargetFolder)"/>
        </ItemGroup>
    
        <Delete Files="@(FilesToClean)" ContinueOnError="true"/>
        <RemoveDir Directories="@(Directories)" />
      </Target>
    

    使用 openfiles 工具删除打开的连接也很好:

    openfiles /disconnect /ID *
    

    【讨论】:

    • 好答案。此外,请使用 $(SolutionDir)\TestResults 之类的东西,因为 GetDirectories 需要绝对路径,这将使其相对于解决方案。
    【解决方案2】:

    下载并安装msbuild extension pack然后使用

    <MSBuild.ExtensionPack.FileSystem.Folder TaskAction="RemoveContent" Path="$(Bin)" />
    

    【讨论】:

    • 扩展包是什么?我必须将它安装在我所有同事的计算机和所有构建服务器上吗?
    • @ColonelPanic 这是由 Mike Fourie(不是 Microsoft)维护的有用 MSBuild 任务的集合。你可以安装它,但我更喜欢将它添加到我的存储库中,这样即使构建机器上没有安装 MSBuild 任务也可以完成构建。
    • 您也可以通过 nuget 添加扩展包。然后,您将在存储库中拥有它,并且 nuget 安装程序会自动配置 csproj 文件以引用扩展包
    猜你喜欢
    • 2018-06-07
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2018-08-23
    • 2015-04-02
    • 2011-11-30
    • 2010-09-16
    相关资源
    最近更新 更多