Я использую командлеты TFS PowerTools в PowerShell, чтобы попытаться получить некоторую информацию о наборах изменений и связанных рабочих элементах с моего сервера. Я свел проблему к поведению, которое я не понимаю, и я надеюсь, что это не относится к TFS (так что кто-то может объяснить мне проблему :))
Вот единственная команда, с которой я могу работать:
Get-TfsItemHistory C:\myDir -recurse -stopafter 5 | % { Write-Host $_.WorkItems[0]["Title"] }
Он делает то, что я ожидаю - Get-TfsItemHistory возвращает список из 5 наборов изменений и передает их в функцию foreach, которая распечатывает заголовок первого связанного рабочего элемента. Так в чем моя проблема? Я пытаюсь написать большой скрипт и предпочитаю кодировать вещи так, чтобы они больше походили на программу на 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, но, похоже, это скорее споры о производительности. Это действительно похоже на то, когда используется трубопровод.
Я не уверен, почему все три подхода не работают. Любое понимание приветствуется.