如何在 Azure Devops / VSTS / TFS 中获取从 "Windows Machine File Copy" 任务复制的文件总数?

How to harvest the total number of files copied from "Windows Machine File Copy" task in Azure Devops / VSTS / TFS?

首先我要说我不知道​​这是否可能,但我希望它是。

我在 Azure Devops 中有几份工作 运行 "Windows Machine File Copy" 任务。 Documentation here.

在任务日志的末尾,有一个显示文件总数的输出...

2019-12-06T20:42:33.2991058Z ------------------------------------------------------------------------------
2019-12-06T20:42:33.2992182Z 
2019-12-06T20:42:33.2994274Z                Total    Copied   Skipped  Mismatch    FAILED    Extras
2019-12-06T20:42:33.2995919Z     Dirs :        29        28         0         0         0         0
2019-12-06T20:42:33.2997487Z    Files :       361       361         0         0         0         0
2019-12-06T20:42:33.2999056Z    Bytes :   89.96 m   89.96 m         0         0         0         0
2019-12-06T20:42:33.3000612Z    Times :   0:00:03   0:00:02                       0:00:00   0:00:00
2019-12-06T20:42:33.3000997Z 
2019-12-06T20:42:33.3002124Z 
2019-12-06T20:42:33.3003761Z    Speed :            31614545 Bytes/sec.
2019-12-06T20:42:33.3005534Z    Speed :            1808.998 MegaBytes/min.
2019-12-06T20:42:33.3006054Z    Ended : Friday, December 6, 2019 2:42:33 PM
2019-12-06T20:42:33.3006989Z 
2019-12-06T20:42:33.3049176Z Copying recursively from...

这个值是否作为变量存储在任何地方?有没有人能够使用这样的日志以编程方式解析来自它们的信息?

您可能会编写一些使用 REST APIs 来检索发布日志的东西。或者您可以只查看 $(System.DefaultWorkingDirectory).

中的文件数

但我会强烈反对这个指标,因为它完全没有意义。不只是对开发人员。给大家。审计员、经理、开发人员、QA 测试人员;选择一个角色,这对担任该角色的人来说毫无意义。无论他们认为这是在衡量什么,它都不是在衡量那个东西。

如果这个想法是要衡量 "size" 或发布背后的风险,那是完全错误的;一个大的变化可能只涉及很少的文件(甚至 删除 个文件),而一个小的变化仍然可以覆盖大量文件。

事实上,您最有可能看到的是 每次 运行 发布 时每个文件都会更新,因为时间戳不同; robocopy 不对 CRCs/hashes 进行操作,它对时间戳进行操作。因此,您真正发现的只是文件数量是增加了还是减少了。这同样没有意义,也没有任何价值。

同意大牛的任命,这对开发者来说似乎毫无意义。但是,如果有人想要这个数据,当然可以解析它。

首先,我们需要知道这个任务是根据什么编译的。我们已经在 github: WindowsMachineFileCopyV2 中公开了这个任务的源代码。可以看到这个任务是用[=​​11=]来实现文件复制的

那么,现在,您的难题可以考虑为 如何读取 Robocopy 输出并将其存储为变量


我想你已经知道似乎没有办法直接对这个任务输出做任何操作。因此,首先,您可以将 /log:{file path} 指定到此 Windows 机器复制文件任务的参数中。

日志看起来像这样:

目前,解析出准确的值并将其存储到变量中非常容易。只需要编写一个脚本来读取值并存储它。我曾经提供过类似的 ,其中关于如何从 shell 输出中编译出值。

此外,您可以查看此 script 以获取更多参考。

## Create Powershell object to tally Robocopy results
$row = "" |select COPIED, MISMATCH, FAILED, EXTRAS
$row.COPIED = [int](($robo_arr[1] -split "\s+")[4]) + [int](($robo_arr[2] -split "\s+")[4])
$row.MISMATCH = [int](($robo_arr[1] -split "\s+")[6]) + [int](($robo_arr[2] -split "\s+")[6])
$row.FAILED = [int](($robo_arr[1] -split "\s+")[7]) + [int](($robo_arr[2] -split "\s+")[7])
$row.EXTRAS = [int](($robo_arr[1] -split "\s+")[8]) + [int](($robo_arr[2] -split "\s+")[8])