gpt4 book ai didi

PowerShell ForEach/管道混淆

转载 作者:行者123 更新时间:2023-12-04 02:03:47 28 4
gpt4 key购买 nike

我在 PowerShell 中使用 TFS PowerTools Cmdlet 尝试从我的服务器获取有关变更集和相关工作项的一些信息。我已将问题归结为我不理解的行为,我希望它不是特定于 TFS 的(所以那里的人可能能够向我解释这个问题:))

这是我可以开始工作的唯一命令:

Get-TfsItemHistory C:\myDir -recurse -stopafter 5 | % { 写主机 $_.WorkItems[0]["Title"]}

它符合我的预期 - Get-TfsItemHistory 返回一个包含 5 个变更集的列表,并将这些变更集通过管道传输到打印出第一个关联工作项的标题的 foreach。那么我的问题是什么?我正在尝试编写一个大型脚本,并且我更喜欢编写看起来更像 C# 程序的代码(powershell 语法让我哭了)。每当我尝试以任何其他方式执行上述操作时,WorkItems 集合为空。

以下命令(我将其解释为逻辑上等效)不起作用(WorkItems 集合为空):

$items = Get-TfsItemHistory C:\myDir -recurse -stopafter 5
$items | ForEach-Object { 写主机 $_.WorkItems[0]["Title"] }

我最喜欢的一个:

$items = Get-TfsItemHistory C:\myDir -recurse -stopafter 5
foreach($items 中的 $item)
{
$item.WorkItems[0]["Title"]
# 做很多其他的事情
}

我读过一篇关于“foreach”运算符和 ForEach-Object Cmdlet 之间区别的文章,但这似乎更像是一场性能辩论。这似乎确实是有关何时使用管道的问题。

我不确定为什么这三种方法都不起作用。任何见解表示赞赏。

最佳答案

这确实令人困惑。现在的解决方法是像这样抓取项目:

$items = @(Get-TfsItemHistory . -r -Stopafter 25 | 
Foreach {$_.WorkItems.Count > $null; $_})

这会访问 WorkItems 集合,这似乎会导致填充此属性(我知道 - WTF?)。在我想使用 foreach 关键字的情况下,我倾向于使用 @() 来生成一个数组。 foreach 关键字的问题是它会迭代一个标量值,包括 $null。因此,如果查询没有返回任何内容,则 $items 将被分配 $null 并且 foreach 将迭代一次循环,并将 $item 设置为 null。现在 PowerShell 通常可以很好地处理空值。但是,如果您将该值交还给 .NET Framework,它通常不会那么宽容。 @() 将保证数组中包含 0、1 或 N 个元素。如果为 0,则 foreach 循环根本不会执行其主体。

顺便说一句,您的最后一种方法 - foreach ($item in $items) { ... } - 应该可以正常工作。

关于PowerShell ForEach/管道混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4009154/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com