首页 > 解决方案 > 使用 Powershell 从 TFS 源代码控制下载文件适用于任何地方,但构建定义

问题描述

我有一个我编写的 PS 脚本,它从团队项目的源代码管理中下载文件。脚本如下:

    function Clear-Folder
    {
        Param ([string]$directory)


        try
        {
            if ((Test-Path -Path $directory -PathType Container))
            {
                Write-Output "INFO: Clearing directory: $directory"
                Remove-Item -Path "$directory\*" -Recurse -Force -Verbose -ErrorVariable exClear -ErrorAction Stop
            }
            else
            {
                Write-Output "INFO: Directory: $directory does not exist, so it is being created."
                New-Item -Path $directory -ItemType Directory -Force -Verbose -ErrorVariable exClear -ErrorAction Stop
                Write-Output "INFO: Directory: $directory successfully created."
            }
        }
        catch
        {
            Write-Output "ERROR: $exClear"
        }
    }

    Add-PSSnapin Microsoft.TeamFoundation.PowerShell

    function Get-TFS
    {
        Param ([string]$TeamProjectName)

        $tfsCollectionPath = 'http://ourtfsserver/tfs/DefaultCollection'
        [Microsoft.TeamFoundation.Client.TfsTeamProjectCollection] $tfs = Get-TfsServer $tfsCollectionPath

        $tfsCollection = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $tfsCollectionPath
        $tfsVersionControl = $tfsCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])

        $locationToSearch = "$/$TeamProjectName/"

        $sourceFolder = "C:\$TeamProjectName"
        Clear-Folder -directory $sourceFolder

        $items = Get-TfsItemHistory -HistoryItem $locationToSearch -Recurse -Server $tfs -Version '1084892~1084927' -IncludeItems |
                Select-Object -Expand "Changes" | 
                    Where-Object { $_.ChangeType -notlike '*Delete*'} | 
                    Where-Object { $_.ChangeType -notlike '*Rename*'} | 
                Select-Object -Expand "Item" | 
                    Where-Object { $_.ContentLength -gt 0} 


        Write-Output $items.Count

        foreach ($item in $items)
        {
            Write-Output $item

            $itemFullName = $item.ServerItem
            Write-Output $itemFullName
            try
            {
                $path = $itemFullName.Replace($locationToSearch, "$sourceFolder\")
                $path = $path.Replace('/', '\')
                Write-Output $locationToSearch
                Write-Output $sourceFolder
                Write-Output $path
                Write-Output "INFO: Downloading file: $itemFullName to: $path"
                $tfsVersionControl.DownloadFile($itemFullName, $path)
            }
            catch [System.Exception]
            {
                $exceptionMessage = $_.Exception.message
                Write-Output "ERROR: Downloading file: $itemFullName to: $path failed; exception message: $exceptionMessage"
            }
        }
    }


    Get-TFS -TeamProjectName 'A'
    Get-TFS -TeamProjectName 'B'
    Get-TFS -TeamProjectName 'C'

我在三个位置运行此脚本:
1. 在脚本的初始开发和测试期间在我的机器上本地运行
2. 具有操作系统的服务器:Windows Server 2012 R2
3. 在位置 #2 的服务器上的 TFS 2015 构建定义中

该脚本运行良好,并且在一个团队项目的所有 3 个位置都没有问题。然后我再次运行脚本,但将不同的团队项目传递给“Get-TFS”函数。它适用于位置 #1 和 #2,但不适用于位置 #3。我已经尝试了多个不同的团队项目(我们有几十个),到目前为止,它只在第一个的所有 3 个位置工作。所有其他仅适用于位置 #1 和 #2,但不适用于位置 #3。“不工作”是指它在构建定义中产生以下 PS 日志:

“没有为指定的项目和版本组合找到历史条目。”

(对于我的脚本中的代码,输出“0”字符,不带双引号字符:“Write-Output $items.Count”)

因此,在位置 #3 中运行时,它无法找到历史记录中的任何项目,即使它在位置 #1 和 #2 中运行时确实找到了项目并成功下载了它们。

知道为什么会这样吗?我怀疑这是某种权限问题,但我找不到任何东西,而且我觉得奇怪的是,如果是这种情况,它会在 2/3 的位置正常工作,而不是在所有 3 个位置都失败.

其他需要注意的重要细节:
1. 我已经仔细检查了几次,现在团队项目名称都拼写正确。
2. 变更集范围是正确的,并且确实包含要在我正在尝试的所有团队项目中在该范围内下载的文件。请记住,当我在位置 #1 和 #2 中运行脚本时,我会获得结果并成功下载文件。
3. 我意识到这可能是 TFS 2015 的一些奇怪错误,升级到 Azure 可能会很好地解决问题。我很想升级,但不幸的是,我在一个工作场所,那里的人坐在比我更大的桌子后面来决定升级的时间。他们正计划这样做,但与此同时,我仍然需要这样做或找到一些解决方法来让我度过难关。

更新:
我运行了以下行:

$PSVersionTable.PSVersion

在所有三个位置,结果如下:

位置 1:
主要:5
次要:1
构建:14409
修订:1018主要修订
:0
次要修订:1018

位置 2:
主要:5
次要:1
构建:14409
修订:1018

位置 3:
主要:5
次要:1内部版本
:14409
修订版:1018主要修订版
:0
次要修订版:1018

所以powershell版本都是一样的。那不是问题。

标签: powershelltfsversion-controltfsbuildbuild-definition

解决方案


推荐阅读