从Where-Object计算对象

时间:2009-07-20 10:03:59

标签: powershell

我目前正在尝试编写一个小的PowerShell脚本(我没有使用Powershell脚本编写经验,因此希望将其用作测试),它循环遍历我们的svn存储库,计算已经通过评论“已审核”进行了多少次提交by; No-one“因为这表示未经审核的提交。

我目前有以下

$repositorys = @("Path1", "path2","path3","path4")
$matches = 0
foreach ($path in $repositorys){
"Path: {0}" -f $path.tostring() 
( [xml] (svn log --xml $path)).log.logentry | Where-Object {$_.msg -imatch "(Reviewed By: (no(.*)one))" } | measure-object | format-list

}

根据发现的匹配数量,这给了我带计数的输出

          Count Average             Sum                 Maximum             Minimum             Property
          ----- -------             ---                 -------             -------             --------
              1

如果我删除了measure-object,那么我将获得SVN提交的详细信息(修订版,作者,消息,日期等)

基本上我希望能够报告的是未经审核的提交的数量和细节(基本上是上述两种方法之间的合并)。所以我的报告看起来像

路径1:

Number of un-reviewed commits: xx
   Revision             Author
   --------             ------- 
    x                    x

谁能开导我?这可能吗?

2 个答案:

答案 0 :(得分:5)

这是Tee-Object cmdlet的用途。

[xml] (svn log --xml $path)).log.logentry | 
    ? {$_.msg -imatch "(Reviewed By: (no(.*)one))" } | 
    tee -variable temp | 
    measure |
    % { "Number of un-reviewed commits: $($_.count)" }
$temp | fl

这里没有任何东西可以通过手动分解管道而无法做到。分配变量,但“tee”是一个方便的快捷方式。

它的另一个常见用途是将中间结果写入文件。有关详细信息,请参阅“help tee -examples”。

答案 1 :(得分:2)

好吧,在这种情况下,你必须输出两个不同的东西。我建议你保存在变量中完成工作的管道的结果,然后执行以下操作:

$x = ( [xml] (svn log --xml $path)).log.logentry | Where-Object {$_.msg -imatch "(Reviewed By: (no(.*)one))" }

Write-Host Number of un-reviewed commits: ($x.Count)
$x | fl

因此,您只需输出数字,然后从管道中删除您的集合以进行打印。