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