Tfs Cmdlet 提取过多项目

Tfs Cmdlet Pulling Too Many Items

我正在编写 PowerShell 脚本来自动执行某些 post 构建活动。即,部分发布需要生成 SQL 文件列表,以便 DBA 可以编译发布脚本。

我的脚本有效,只是它提取了太多文件。当我指定一个变更集时,它会从其他几个变更集中拉回文件。在我正在测试的团队项目中,它拉回 all SQL 文件(所有五个),但我只想要 SQL 文件实际关联提供的 ChangesetId.

这是我的脚本。谁能告诉我我做错了什么,以及如何让它只从特定的变更集中提取文件?

# Loads Windows PowerShell snap-in if not already loaded
if ( (Get-PSSnapin -Name Microsoft.TeamFoundation.PowerShell -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PSSnapin Microsoft.TeamFoundation.PowerShell
}

# Variables - CHECK EACH TIME
[string] $tfsCollectionPath = "http://validtfsurl:8080/tfs"
[string] $locationToSearch = "$/Sandbox/Database/"
[string] $outputFileDir = "C:\TFSTest\"
[string] $outputFileName = $outputFileDir + "ChangedSQLFiles.txt"
[string] $changeset = "C111"

 if (-not [IO.Directory]::Exists($outputFileDir))
 {
    [IO.Directory]::CreateDirectory($outputFileDir) | Out-Null
 }

[Microsoft.TeamFoundation.Client.TfsTeamProjectCollection] $tfs = get-tfsserver $tfsCollectionPath

# Add informational header to file manifest
[string] $outputHeader =
    "TFS Collection: " + $tfsCollectionPath + "`r`n" + 
    "Source Location: " + $locationToSearch + "`r`n" + 
    "Changeset: " + $changeset + "`r`n" +
    "Created: " + (Get-Date).ToString() + "`r`n" +
    "======================================================================" 
$outputHeader | Out-File $outputFileName -Append

$items = Get-TfsItemHistory $locationToSearch -Server $tfs -Version $changeset -Recurse -IncludeItems | 
Select-Object -Expand "Changes" | 
    Where-Object { $_.ChangeType -notlike '*Delete*'} | 
    Where-Object { $_.ChangeType -notlike '*Rename*'} | 
    Where-Object { ($_.ChangeType -like '*Edit*') `
        -or ($_.ChangeType -like '*Add*')} |  
Select-Object -Expand "Item" | 
    Where-Object { $_.ContentLength -gt 0} |  
    Where-Object { $_.ServerItem -like '*.sql' } |
Select-TfsItem |
Sort -Unique Path

foreach($item in $items)
{
    [string] $ItemPath_Local = $item.Path.Trim()
    [int] $ItemPath_Length = $ItemPath_Local.Length - 19

    $ItemPath_Local = $ItemPath_Local.Replace("/", "\")
    $ItemPath_Local = $outputFileDir + "SqlFiles\" + $ItemPath_Local.Substring(19, $ItemPath_Length)

    Get-TfsChildItem $item.Path -Server $tfs -Version $changeset |
    %{$_.DownloadFile(@(join-path $outputFileDir (split-path $_.ServerItem -leaf)))}

    $item.Path.Trim() | Out-File $outputFileName -Append
}   

[string] $outputFooter = "======================================================================" 
$outputFooter | Out-File $outputFileName -Append

在研究其他内容时,我发现 this MSDN page 描述了 Merge 命令的语法(尽管是针对较旧的 TFS 版本),我注意到他们正在使用

C1~C1

获取单个变更集。我将脚本声明更改为

# Variables - CHECK EACH TIME
[string] $tfsCollectionPath = "http://validtfsurl:8080/tfs"
[string] $locationToSearch = "$/Sandbox/Database/"
[string] $outputFileDir = "C:\TFSTest\"
[string] $outputFileName = $outputFileDir + "ChangedSQLFiles.txt"
[string] $changeset = "C111"
[string] $changesetRange = "C111~C111"

然后我将 Get-TfsItemHistory 调用更改为

$items = Get-TfsItemHistory $locationToSearch -Server $tfs -Version $changesetRange -Recurse -IncludeItems | 
Select-Object -Expand "Changes" | 
    Where-Object { $_.ChangeType -notlike '*Delete*'} | 
    Where-Object { $_.ChangeType -notlike '*Rename*'} | 
    Where-Object { ($_.ChangeType -like '*Edit*') `
        -or ($_.ChangeType -like '*Add*')} |  
Select-Object -Expand "Item" | 
    Where-Object { $_.ContentLength -gt 0} |  
    Where-Object { $_.ServerItem -like '*.sql' } |
Select-TfsItem |
Sort -Unique Path

最后,只使用单个变更集来执行下载

Get-TfsChildItem $item.Path -Server $tfs -Version $changeset |
%{$_.DownloadFile(@(join-path $outputFileDir (split-path $_.ServerItem -leaf)))}

这奏效了。在我的最终代码中,我实际上将使用 TFS 环境变量来获取变更集,但执行是相同的。