我正在 PowerShell 中使用 TFS PowerTools Cmdlet 尝试从我的服务器获取有关变更集和相关工作项的一些信息。我已将问题归结为我不理解的行为,我希望它不是 TFS 特定的(所以那里的人可能能够向我解释问题:))
这是我可以开始工作的唯一命令:
Get-TfsItemHistory C:\myDir -recurse -stopafter 5 | % { Write-Host $_.WorkItems[0]["Title"] }
它执行了我所期望的操作 - Get-TfsItemHistory 返回 5 个 ChangeSet 的列表,并将它们通过管道传输到 foreach,该 foreach 打印出第一个关联 WorkItem 的标题。那么我的问题是什么?我正在尝试编写一个大型脚本,并且我更喜欢编写看起来更像 C# 程序的代码(powershell 语法让我哭泣)。每当我尝试以任何其他方式执行上述操作时,WorkItems 集合都是空的。
以下命令(我将其解释为逻辑上等效)不起作用(WorkItems 集合为空):
$items = Get-TfsItemHistory C:\myDir -recurse -stopafter 5
$items | ForEach-Object { Write-Host $_.WorkItems[0]["Title"] }
我真正更喜欢的一个:
$items = Get-TfsItemHistory C:\myDir -recurse -stopafter 5
foreach ($item in $items)
{
$item.WorkItems[0]["Title"]
# do lots of other stuff
}
我读过一篇关于“foreach”运算符和 ForEach-Object Cmdlet 之间差异的文章,但这似乎更多是性能争论。这确实是一个关于何时使用管道的问题。
我不确定为什么这三种方法都不起作用。任何见解都值得赞赏。
这确实令人困惑。目前的解决方法是像这样获取项目:
$items = @(Get-TfsItemHistory . -r -Stopafter 25 |
Foreach {$_.WorkItems.Count > $null; $_})
这会访问 WorkItems 集合,这似乎会导致填充此属性(我知道 - WTF?)。我倾向于使用@()
在我想使用 foreach 关键字的情况下生成数组。 foreach 关键字的作用是它将迭代一个标量值,包括 $null。所以如果查询没有返回任何内容,$items
被分配 $null 并且 foreach 将迭代循环一次$item
设置为空。现在,PowerShell 通常可以很好地处理空值。但是,如果您将该值交还给 .NET Framework,它通常不会那么宽容。这@()
将保证数组中包含 0、1 或 N 个元素。如果为 0,则 foreach 循环根本不会执行其循环体。
顺便说一句,你最后的方法 -foreach ($item in $items) { ... }
- 应该可以正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)