Путаница в PowerShell ForEach / Piping

Я использую командлеты TFS PowerTools в PowerShell, чтобы попытаться получить некоторую информацию о наборах изменений и связанных рабочих элементах с моего сервера. Я свел проблему к поведению, которое я не понимаю, и я надеюсь, что это не относится к TFS (так что кто-то там может объяснить мне проблему :))

Вот единственная команда, которую я могу получить для работы:

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

Он делает то, что я ожидал - Get-TfsItemHistory возвращает список из 5 наборов изменений и передает их в 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, но, похоже, это скорее споры о производительности. Это действительно похоже на проблему, когда используется трубопровод.

Я не уверен, почему все три из этих подходов не работают. Приветствуется любое понимание.

11
задан hexate 24 October 2010 в 16:33
поделиться