문제

누구든지 편리한 powershell 스크립트를 가지고 있습니까? 수정 날짜를 기준으로 TFS에서 파일 세트를 가져옵니다.?"이 폴더(또는 하위 폴더)에서 X/Y/ZZZZ 이후에 수정된 모든 파일을 제공하세요"라고 말하고 해당 파일을 일반적으로 이동하는 폴더가 아닌 다른 폴더에 덤프합니다.나는 해킹하고 결국 이 작업을 완료할 만큼 충분한 파워셸을 알고 있지만, 그런 일은 피하고 싶습니다.

도움이 되었습니까?

해결책

당신이 가지고 있는지 확인하십시오 Team Foundation 2015 전동 공구 설치되었습니다.PowerShell 스냅인과 함께 제공됩니다.시작 그룹에서 바로 PowerShell 콘솔 파일을 실행하거나 Add-PSSnapin Microsoft.TeamFoundation.PowerShell을 실행할 수 있습니다.그런 다음 작업 공간으로 이동하여 다음을 실행합니다.

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    Format-Table CheckinDate,TargetServerItem -auto

CheckinDate           TargetServerItem 
-----------           ----------------
9/14/2009 1:29:23 PM  $/Foo/Trunk/Bar.sln                            
9/29/2009 5:08:26 PM  $/Foo/Trunk/Baz.sln       

해당 정보를 디렉토리에 덤프하려면:

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    Select TargetServerItem > c:\recentlyChangedFiles.txt

해당 파일을 다른 디렉터리에 복사하려면(여기서는 해당 파일을 로컬에서 작업 폴더로 끌어내렸다고 가정합니다):

Get-TfsItemProperty . -r | Where {$_.CheckinDate -gt (Get-Date).AddDays(-30)} | 
    CopyItem -Path $_.LocalItem -Destination C:\SomeDir -Whatif

이는 파일을 플랫 폴더 구조로 복사합니다.dir 구조를 유지하려면 좀 더 복잡합니다.

다른 팁

Keith와 같은 Get-TfsItemProperty를 사용하면 파일 복사를 위한 작업 공간만 필요한 것이 아닙니다.이는 소스 제어 탐색기에서 가장 흔히 볼 수 있는 로컬 정보에 대한 서버 쿼리인 GetExtendedItems()에 대한 래퍼입니다.보고되는 버전 정보에 의존하여 파일 자체가 다운로드되었다고 가정합니다(보다 일반적으로: 동기화됨, 이름 변경 및 삭제의 경우) 지난 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

첫 번째는 더 저렴한 쿼리를 사용하고 작업공간 종속성을 제거하여 Keith의 코드를 직접 적용한 것입니다.해당 디렉토리 아래의 항목 중 높은 비율이 최근에 수정되었음을 알고 있는 경우 가장 좋은 옵션입니다.

두 번째 옵션은 변경 집합 기록을 직접 쿼리합니다.클라이언트 대신 SQL에서 Where 절을 계산하도록 하면 최근에 항목의 낮은 %가 변경된 경우(종종 그렇듯이) 훨씬 더 효율적일 수 있습니다.그러나 반환된 큰 변경 집합이 많으면 항목 기반 쿼리가 지연되어 서버의 JOIN이 항목 속성을 가져오는 데 비용이 많이 들고 클라이언트 측 중복 제거에 많은 작업이 필요하게 됩니다.

[예, -Version에 문자열이 필요한 것은 Powershell과 같지 않다는 것을 알고 있습니다.내 잘못이야.너 ~할 수 있었다 new-object로 DateVersionSpec을 생성하고 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() 호출의 범위는 우리가 관심 있는 정확한 항목 집합으로 지정됩니다.물론 다운로드 시간에 병목 현상이 발생할 가능성도 제거합니다.이는 변경 세트 수가 적고 Keith의 작업 공간 동기화에 대해 제기한 우려가 어떤 이유로든 관련이 없을 때 가장 좋은 솔루션일 것입니다.

이 작업을 수행하기 위해 powershell을 사용하는 것이 터무니없는 것 같다고 말할 수 있습니까?

FWIW, 저는 4.5년 동안 MS 내부 및 외부에서 TFS에 참여해 왔지만 이 기능이 요청된 것을 본 적이 없습니다.실제로 달성하려는 목표가 무엇인지 확장할 수 있다면 더 나은 방법을 제안할 수 있을 것 같습니다.오해하지 마세요. 저는 이와 같은 이상한 시나리오를 처리하기 위해 Powershell 확장 프로그램을 정확하게 작성했습니다.그러나 종종 이는 완전히 다른 도구에 대한 작업입니다. 예:주석 달기, MSBuild, DB 스키마 비교...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top