如何从“删除文件”任务中排除某些目录和文件

时间:2020-03-05 13:53:30

标签: azure azure-devops azure-pipelines

我想从$(Build.ArtifactStagingDirectory)中删除所有文件(在适当的构建代理程序的文件夹中被称为“ a”文件夹,单击here以了解有关Azure管道中预定义变量的更多信息)。我也知道Delete Files task使用minimatch patterns

我的$(Build.ArtifactStagingDirectory)的内部结构:

a
|--Client
|       |--ImportantFolder
|       |                |--FileNumber1
|       |                |--....(Many other files here)
|       |                |--FileNumberN
|       |--OtherJunkFolder
|       |--OtherFile
|--JunkFolder

因此,文件夹a有两个子文件夹(ClientJunkFolder),Client文件夹有一个名为ImportantFolder的文件夹,一个名为{ {1}}和一个名为OtherJunkFolder的文件。 OtherFile包含许多具有不同名称和扩展名的文件。

我如何从文件夹ImportantFolder中删除文件夹a中的所有文件夹和文件?换句话说:我想做这样的事情:

Client/ImportantFolders

但是此模式会删除文件夹** !Client/ImportantFolder/** 中的所有内容。我也尝试过

a

还有

**
!(Client/**)

两个都不起作用。

2 个答案:

答案 0 :(得分:1)

尝试不使用**且仅使用!(Client),它将删除JunkFolder文件夹之外的Client

您可以做Client/ImportantFolder,我不知道为什么,我想是因为删除看起来是在a文件夹上,而不是更深。

答案 1 :(得分:1)

测试后,模式!(Client)有效。但这也将OtherJunkFolderOtherFile保留在客户端文件夹中。

模式!(Client/ImportantFolder)不起作用。

作为解决方法,您可以使用脚本任务从文件夹中删除除客户端/重要文件夹中的所有文件夹和文件。请在powershell任务中检查以下powershell脚本。

Get-ChildItem "$(build.artifactstagingdirectory)" | where { $_.Name -inotmatch "Client" } | Remove-Item -Recurse
Get-ChildItem "$(build.artifactstagingdirectory)/Client" | where { $_.Name -inotmatch "ImportantFolder" } | Remove-Item -Recurse

另一个可能的解决方法是使用复制文件任务将文件夹Client/ImportantFolder复制到新文件夹。对于下面的示例,文件夹Client/ImportantFolder将被复制到新文件夹$(Agent.BuildDirectory)/a1。然后将以下任务指向该新文件夹。

enter image description here

如果您的意图是仅将文件夹Client/ImportantFolder包含在要发布的工件中,请在以下“发布构建工件”任务中进行发布。最简单的方法是将Path to publish指向文件夹Client/ImportantFolder。这样,发布的工件将仅具有文件夹Client/ImportantFolder。请检查以下示例:

enter image description here