简体   繁体   English

使用Powershell从tfs文件夹获取最新的检入文件

[英]Get the latest checkin files from a tfs folder using powershell

Hi i am actually new to powershell. 嗨,我实际上是Powershell新手。 I am trying to do ETL database deployment, so i need all the files with in the tfs folder after a given time. 我正在尝试进行ETL数据库部署,因此在给定的时间后,我需要tfs文件夹中的所有文件。 I established the connection with the tfs but i am able to download the files but if a file has two check-ins i am getting the file with the previous checkin and not the latest 我建立了与tfs的连接,但是我可以下载文件,但是如果文件有两个签入,则我使用先前签入而不是最新签入来获取文件

My code: 我的代码:

$TfsUrl = "http://tfs2013-xxx02.ad.xxx.com:8080/tfs/abcd-xxx243"

    # Load TFS assemblies for connecting to the TFS server 
    Add-Type -Path "E:\Microsoft Visual Studio 14.0\Common7\IDE\TestAgent\Microsoft.TeamFoundation.Client.dll"
    Add-Type -Path "E:\Microsoft Visual Studio 14.0\Common7\IDE\TestAgent\Microsoft.TeamFoundation.Common.dll"
    Add-Type -Path "E:\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\4qvjm2or.ipa\Microsoft.TeamFoundation.Lab.Client.dll"
    Add-Type -Path "E:\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\4qvjm2or.ipa\Microsoft.TeamFoundation.Lab.Common.dll"
    Add-Type -Path "E:\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\4qvjm2or.ipa\Microsoft.TeamFoundation.VersionControl.Client.dll"

    #Get TFS Instance   
    $Tfs = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($TfsUrl)

    # use the account credentials of the process running the script
    try 
    {
        $Tfs.EnsureAuthenticated()
        Write-Output "TFS Connection is successful"
    }
    catch 
    {
        Write-Output "Error trying to connect to tfs server.  Check your tfs permissions and path: $_ " 
        Exit(1)
    }

    #Write-Message $LogFileName "THIS IS INSIDE Connect-ToTFS"
    #Write-Message $LogFileName "TFS IS $Tfs"

$DeploymentFilePath= "$/xxxx/FutureReleases/Database/ReportingETLs"

$TFSInstance    = $Tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
$LatestVersion  = [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest
$RecursionType  = [Microsoft.TeamFoundation.VersionControl.Client.RecursionType]::Full  


$DateFrom   = "D2016-10-08T01:59"

# Get the From and To date-time in version format to be passed to TFS API
$VersionFrom    = $null 
$VersionFrom    = [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::ParseSingleSpec($DateFrom, "")      

$FileHistory    = @($TFSInstance.QueryHistory($DeploymentFilePath,$LatestVersion,0,$RecursionType,$null,$null,$null,[int32]::MaxValue, $true ,$true, $true))

#Write-Output "Filehistory is: $FileHistory"

#$ChangeSetCount = $FileHistory.Count
#Write-Output "ChangeSetCount is: $ChangeSetCount"


$TFSGetFullPath = "E:\temp\"
$chArray = @()
$checkin =""

foreach ($history in $FileHistory)
{
    foreach ($change in $history.Changes)
    {
        foreach ($item in $change.item)
        {

            if($item.CheckinDate -gt $VersionFrom.Date)
            {
                $chArray += $history.ChangesetId 


            }
        }
    }
}

Write-Output "ChangesetArray is: $chArray"
foreach ($ch in $chArray) 
{
    foreach ($lastdeployedHistory in $FileHistory)       
    {      
        if($lastdeployedHistory.ChangesetId -eq  $ch)
        {
            foreach ($workitem in $lastdeployedHistory.Changes)
            { 
                $workitem.Item.DownloadFile([IO.Path]::GetFullPath($TFSGetFullPath) + $workitem.Item.ServerItem.Split('/')[$workitem.Item.ServerItem.Split('/').Length - 1]);
            }
        }                                                                                                                
    }
}

This is caused by the object order in $chArray. 这是由于$ chArray中的对象顺序引起的。 The changeset in $chArray is ordered from new to old. $ chArray中的变更集按从新到旧的顺序排列。 When you download the file, it is downloading the new file first and then download the older file. 当您下载文件时,它将先下载新文件,然后再下载旧文件。

For example, there are two changesets for one file: 111 and 112, with the code Write-Output "ChangesetArray is: $chArray" in your script, you should see the output like: ChangesetArray is: 112 111 . 例如,一个文件有两个变更集:111和112,脚本中的代码为Write-Output "ChangesetArray is: $chArray" ,您应该看到如下输出: ChangesetArray is: 112 111 When it downloads the file, the file with 112 version is downloaded first and then 111 version which overwrite the latest version. 下载文件时,首先下载112版本的文件,然后下载111版本的文件,该版本将覆盖最新版本。

You can sort the array in $chArray to fix this issue: 您可以在$ chArray中对数组进行排序以解决此问题:

Write-Output "ChangesetArray is: $chArray"

$sortcsarray = $chArray | Sort-Object

Write-Output "ChangesetArray is: $sortcsarray"

foreach ($ch in $sortcsarray) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM