根据修改的时间从目录MsBuild-删除文件/名称 [英] MsBuild- Delete files from a directory based on time modified / name

查看:243
本文介绍了根据修改的时间从目录MsBuild-删除文件/名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对每个生成文件列表建立的目录里面 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.zip TestBuild-1.0.0.6.zip

我怎么可以用的MSBuild呢?

注意:

我成功的一个项目,以获取上面所列内容

 < Exec的工作目录=$(工件)\\ ..命令=DIR / B / A:-D / O:-N输出=ArchiveFileList/&GT ;


解决方案

好了,我们写了一个自定义任务的文件他们的名字,然后输出的文件列表排序,以删除(不包括在列表中的前两个)到项目

自定义任务:

 < UsingTask
    TASKNAME =清理
    TaskFactory =codeTaskFactory
    AssemblyFile =$(MSBuildToolsPath)\\ Microsoft.Build.Tasks.v4.0.dll>
    < ParameterGroup>
      < TARGETPATH​​参数类型=System.String必需=真/>
      < BackupLength参数类型=System.Int32必需=真/>
      < FilesToExclude参数类型=System.String []输出=真/>
      < FilesToDelete参数类型=System.String []输出=真/>
    < / ParameterGroup>
    <任务>
      <使用命名空间=System.IO/>
      <使用命名空间=System.Linq的/>
      < code TYPE =碎片LANGUAGE =CS>
        <![CDATA [
        VAR diInfo =新DirectoryInfo的(TARGETPATH​​);
            如果(diInfo.Exists)
            {
                VAR fiInfo = diInfo.GetFiles()OrderByDescending(文件=> file.Name)。                FilesToExclude = fiInfo.Take(BackupLength)。选择(文件=> file.FullName).ToArray();
                FilesToDelete = fiInfo.Skip(BackupLength)。选择(文件=> file.FullName).ToArray();
            }
        ]]>
      < / code>
    < /任务>
  < / UsingTask>

用法

 <! - 干净的旧档案。保持近两年并删除休息。 - >
&所述;清理TARGETPATH​​ =$(PackageRoot)BackupLength =2>
  <输出TaskParameter =FilesToDeleteITEMNAME =FilesToClean/>
< /清除><消息文本=清理旧档案重要性=高/>
<删除文件=@(FilesToClean)/>

I have a list of files generated on each build inside a directory C:\BuildArtifacts

The Contents of a directory looks like this:

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

Now, with each incremental build, I just want to retain two recent artifacts and delete the rest. So, in this example, I want to retain TestBuild-1.0.0.5.zip and TestBuild-1.0.0.6.zip

How can I do it with MSBuild?

Note:

I have managed to fetch the above list in an item

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

解决方案

Well, we wrote a custom task to sort the files by their name and then output the list of the files to delete (excluding the first two in the list) into an Item

Custom Task:

 <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>

Usage:

<!-- 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)" />

这篇关于根据修改的时间从目录MsBuild-删除文件/名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆