build - MsBuild-根据修改时间/名称从目录中删除文件

标签 build msbuild cmd msbuild-4.0

我在目录 C:\BuildArtifacts

中有每个构建生成的文件列表

目录的内容如下所示:

TestBuild-1.0.0.1.zip
TestBuild-1.0.0.2.zip
TestBuild-1.0.0.3.zip
TestBuild-1.0.0.4.zip
TestBuild-1.0.0.5.zip
TestBuild-1.0.0.6.zip

现在,对于每个增量构建,我只想保留两个最近的工件并删除其余的。所以,在这个例子中,我想保留 TestBuild-1.0.0.5.zipTestBuild-1.0.0.6.zip

如何使用 MSBuild 实现?

注意事项:

我已经设法在一个项目中获取上面的列表

 <Exec WorkingDirectory="$(Artifacts)\.." Command="dir /B /A:-D /O:-N" Outputs="ArchiveFileList" />

最佳答案

好吧,我们编写了一个自定义任务来按文件名对文件进行排序,然后将要删除的文件列表(不包括列表中的前两个)输出到 Item

自定义任务:

 <UsingTask
    TaskName="Cleanup"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup>
      <TargetPath ParameterType="System.String" Required="true"/>
      <BackupLength ParameterType="System.Int32" Required="true"/>
      <FilesToExclude ParameterType="System.String[]" Output="true" />
      <FilesToDelete ParameterType="System.String[]" Output="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System.IO" />
      <Using Namespace="System.Linq" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
        var diInfo = new DirectoryInfo(TargetPath);
            if (diInfo.Exists)
            {
                var fiInfo = diInfo.GetFiles().OrderByDescending(file => file.Name);

                FilesToExclude = fiInfo.Take(BackupLength).Select(file => file.FullName).ToArray();
                FilesToDelete = fiInfo.Skip(BackupLength).Select(file => file.FullName).ToArray();
            }
        ]]>
      </Code>
    </Task>
  </UsingTask>

用法:

<!-- Clean old archives. Keep the recent two and deletes rest. -->
<Cleanup TargetPath="$(PackageRoot)" BackupLength="2">
  <Output TaskParameter="FilesToDelete" ItemName="FilesToClean" />
</Cleanup>

<Message Text="Cleaning Old Archives" Importance="High" />
<Delete Files="@(FilesToClean)" />

关于build - MsBuild-根据修改时间/名称从目录中删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843967/

相关文章:

java - 在 javac 中强制执行包声明检查

scala - SBT 错误 : java. lang.RuntimeException:未检测到主类

c++ - 模块会成为 C++20 的一部分吗?它会减少库的编译时间吗?

visual-c++ - MSBuild 忽略项目文件中的 CLToolExe 属性

Python如何使 ping -t 脚本无限循环

ios - 当我在 Xcode 中将 Compile Source As Objective-C 更改为外部库时出现错误

.net - F# 和 .Net 版本

windows - 如何在 Windows 命令行中用 fart.exe 替换 csv 中的换行符?

batch-file - For循环批处理中的多个条件?

msbuild - WiX热: Pre-build event fires too early on build server