Search code examples
powershelltfstfs-power-tools

Copy files from tfs versioncontrol to directory with PowerShell


Does somebody know if it is possible to Copy files from TFS (2013 Update 2) source control to a specific folder on your computer?

Let's say I have the server path $/BuildTemplate2013/BuildProcessSource and I want all the files of that directory to be copied/downloaded to C:\destinationDir with PowerShell. Is that possible? I have the TFS 2013 Update 2 Power tools installed but I can't find any command for that...


Solution

  • I've created a PowerShell script that connects to the TFS server with the TFS assemblies. I then loop through the files on the server (in a specific path) and download it recursively.

    # The deploy directory for all the msi, zip etc.
    $AutoDeployDir = "Your TFS Directory Server Path"
    $deployDirectory = $($Env:TF_BUILD_DROPLOCATION + "\Deploy\" + $Env:TF_BUILD_BUILDNUMBER)
    
    # Add TFS 2013 dlls so we can download some files
    Add-Type -AssemblyName 'Microsoft.TeamFoundation.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    Add-Type -AssemblyName 'Microsoft.TeamFoundation.VersionControl.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    $tfsCollectionUrl = 'http://YourServer:8080/tfs/YourCollection' 
    $tfsCollection = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $tfsCollectionUrl
    $tfsVersionControl = $tfsCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
    
    # Register PowerShell commands
    Add-PSSnapin Microsoft.TeamFoundation.PowerShell
    
    # Get all directories and files in the AutoDeploy directory
    $items = Get-TfsChildItem $AutoDeployDir -Recurse
    
    # Download each item to a specific destination
    foreach ($item in $items) {
        # Serverpath of the item
        Write-Host "TFS item to download:" $($item.ServerItem) -ForegroundColor Blue
    
        $destinationPath = $item.ServerItem.Replace($AutoDeployDir, $deployDirectory)
        Write-Host "Download to" $([IO.Path]::GetFullPath($destinationPath)) -ForegroundColor Blue
    
        if ($item.ItemType -eq "Folder") {
            New-Item $([IO.Path]::GetFullPath($destinationPath)) -ItemType Directory -Force
        }
        else {
            # Download the file (not folder) to destination directory
            $tfsVersionControl.DownloadFile($item.ServerItem, $([IO.Path]::GetFullPath($destinationPath)))
        }
    }