Использование Get-TfsItemProperty, такого как Keith, не требует только рабочего пространства для копий файлов. Это оболочка для GetExtendedItems (), серверный запрос локальной информации, наиболее часто встречающийся в Source Control Explorer. Полагаясь на информацию о версии, которую он сообщает, вы предполагаете, что сами файлы были загружены (в более общем случае: синхронизировано , в случае переименования и удаления) за последние 30 дней. Если рабочее пространство не обновлено, вы пропустите некоторые файлы / дадите им устаревшие имена / и т. Д. Это также довольно дорого, так как информационные команды идут.
Некоторые альтернативные примеры:
# 1
Get-TfsChildItem $/FilesYouWant -R |
? { $_.CheckinDate -gt (Get-Date).AddDays(-30) } |
% { $_.DownloadFile(join-path C:\SomeDir (split-path $_.ServerItem -leaf)) }
# 2
Get-TfsItemHistory $/FilesYouWant -R -All -Version "D$((Get-Date).AddDays(-30).ToString('d'))~" |
Select-TfsItem |
Select -Unique -Expand Path |
Sort |
Out-File c:\RecentlyChanged.txt
Первый - это простая адаптация кода Кейта, использование более дешевого запроса и устранение зависимости от рабочей области. Это лучший вариант, если вы знаете, что% товаров из этого каталога были недавно изменены.
Второй вариант напрямую запрашивает историю изменений. Позволяя выражению Where вычисляться в SQL, а не на клиенте, это может быть на порядок более эффективным, если низкий процент элементов был изменен недавно (как это часто бывает). Тем не менее, это приведет к отставанию запросов на основе элементов, если будет возвращено много больших наборов изменений, что сделает серверный JOIN для захвата свойств элемента дорогим и вынудит наше удаление дубликатов на стороне клиента выполнять большую работу.
[Да, я знаю, что наличие -Version требует строки, не очень в духе Powershell; моя вина. Вы могли бы создать DateVersionSpec с new-object и вызвать его ToString (), но это еще больше работы.]
Я не показывал каждую комбинацию вызова API + желаемую задачу. Само собой разумеется, что вы можете использовать # 1 для генерации списка файлов и # 2 для (повторной) загрузки путем изменения второй половины конвейера. Вы даже можете комбинировать эту технику копирования с эффективностью Get-TfsItemHistory:
# 2b, with local-to-local copying
Get-TfsItemHistory $/FilesYouWant -R -All -Version "D$((Get-Date).AddDays(-30).ToString('d'))~" |
Select-TfsItem |
Select -Unique -Expand Path |
Get-TfsItemProperty |
Copy $_.LocalItem -Dest C:\SomeDir
Это правда, что это делает вторую поездку туда и обратно на сервер, но благодаря начальному запросу вызов GetExtendedItems () будет ограничен точным набором элементов, которые нас интересуют. И, конечно, мы исключаем любые шансы, что время загрузки становится узким местом. Вероятно, это лучшее решение из всех, когда количество наборов изменений невелико, и проблемы, с которыми я столкнулся в отношении синхронизации рабочего пространства Кейта, по какой-либо причине не актуальны.
Могу я просто сказать, что для этого нужно использовать PowerShell, что кажется абсурдом.
FWIW, я был связан с TFS изнутри и снаружи MS в течение 4,5 лет и никогда не видел эту функцию запрошенной. Если бы вы могли рассказать о том, какую цель вы на самом деле пытаетесь достичь, я думаю, мы могли бы предложить лучший способ. Не поймите меня неправильно, я написал расширения Powershell именно для таких странных сценариев, как этот. Но часто это работа для другого инструмента целиком, например: Annotate, MSBuild, сравнение схем БД ...