[英]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.