TFS Integration Pack and Scripting using PowerShell

Recently there has been several requests for the TFS (Team Foundation Server, a.k.a VSTF - Visual Studio Team Foundation) Integration Pack on the Opalis Discussion Alias.  Some of them may already know that we do have such IP available as a prototype.  However, it is for internal use only and unavailable for general public before being productized.  On the other hand, most if not all functionalities of TFS client object model can be easily accessed using PowerShell script.  Therefore, if anyone needs to automate the TFS related scenarios without using TFS IP, I'd like to demonstrate how to do that using PowerShell.


Load TFS assemblies


The first thing is to load .NET assemblies of TFS client object model.  Without this nothing will work.  Here is the list of assemblies:


  • Microsoft.TeamFoundation.Client: must load this first.
  • Microsoft.TeamFoundation.WorkItemTracking.Client: for work item tracking scenarios like open/close bug, query work items, etc.
  • Microsoft.TeamFoundation.VersionControl.Client: for version control with TFS source code repository.
  • Microsoft.TeamFoundation.Build.Client: for team foundation build tasks including query build definitions, request new build, retrieve in-progress build details, etc.
  • Microsoft.TeamFoundation.Server.ICommonStructureService
  • Microsoft.TeamFoundation.Server.IGroupSecurityService


Suppose we want to do both work item tracking and build:






If any command fails, check if TFS assemblies are in the Global Assembly Cache (GAC).  If not in GAC, install Team Explorer or copy those assemblies from another machine with Visual Studio 2010 installed at the directory %ProgramFiles (x86)%\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0.


Connect to TFS server


Suppose the TFS server URL is http://scxtfs2:8080/tfs, the following command connects to the sever and returns the Team Project Collection:


$teamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection("http://scxtfs2:8080/tfs")


Read MSDN doc for more technical details.


Once we have the team project collection, we can use GetService method ( to get a request service including work item tracking or build or version control.


Get and create a work item


Firstly get a instance of WorkItemStore as work item tracking service,


$ws = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore")


After that we can use method GetWorkItem ( to get a work item with the specified ID:


PS C:\scxtfs\zzSandbox\zhyao\script\tfs> $ws.GetWorkItem(36474)



Id                  : 36474

TemporaryId         : 36474

Uri                 : vstfs:///WorkItemTracking/WorkItem/36474

Revision            : 3

Revisions           : {Microsoft.TeamFoundation.WorkItemTracking.Client.Revision, Microsoft.TeamFoundation.WorkItemTrac

                      king.Client.Revision, Microsoft.TeamFoundation.WorkItemTracking.Client.Revision}

Attachments         : {test.psq, test.txt}

WorkItemLinks       : {}

Links               : {}

WorkItemLinkHistory : {}

Store               : Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore

Title               : Test Bug From Opalis

State               : Active

Reason              : New

Rev                 : 3

Description         :

History             :

ChangedBy           : Zhenhua Yao

RevisedDate         : 1/1/9999 12:00:00 AM

ChangedDate         : 5/13/2011 4:03:21 PM

CreatedDate         : 3/7/2011 3:57:48 PM

CreatedBy           : SCX Service Account

NodeName            : zzSandbox

AreaPath            : zzSandbox

AreaId              : 271

IterationPath       : zzSandbox

IterationId         : 271

ExternalLinkCount   : 0

HyperLinkCount      : 0

AttachedFileCount   : 2

RelatedLinkCount    : 0

IsOpen              : True

IsPartialOpen       : False

IsReadOnly          : False

IsReadOnlyOpen      : False

IsNew               : False

Fields              : {Title, State, Rev, Changed By...}

Project             : Microsoft.TeamFoundation.WorkItemTracking.Client.Project

Type                : Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemType

IsDirty             : False

DisplayForm         : <FORM><Layout><Group><Column PercentWidth="100"><Control FieldName="System.Title" Type="FieldCont


To create a new work item, we need to get the team project by:


$proj = $ws.Projects["zzSandbox"]


We can check all types of work items defined in this team project by:


PS C:\scxtfs\zzSandbox\zhyao\script\tfs> $proj.WorkItemTypes | ft


Name                Project             DisplayForm         FieldDefinitions    Description         Store

----                -------             -----------         ----------------    -----------         -----

Bug                 Microsoft.TeamFo... <FORM><Layout><G... {Title, State, R... Describes a dive... Microsoft.TeamFo...

Task                Microsoft.TeamFo... <FORM><Layout><G... {Title, State, R... Includes informa... Microsoft.TeamFo...

Quality of Servi... Microsoft.TeamFo... <FORM><!-- Guide... {Title, State, R... Includes informa... Microsoft.TeamFo...

Scenario            Microsoft.TeamFo... <FORM><!-- Guide... {Title, State, R... Includes informa... Microsoft.TeamFo...

Risk                Microsoft.TeamFo... <FORM><!-- Guide... {Title, State, R... A risk is any pr... Microsoft.TeamFo...

Code Review Resp... Microsoft.TeamFo... <FORM><Layout><G... {Title, State, R... Includes informa... Microsoft.TeamFo...

Backlog Item        Microsoft.TeamFo... <FORM><Layout><G... {Title, State, R... Includes informa... Microsoft.TeamFo...

Test Case           Microsoft.TeamFo... <FORM><Layout><G... {Title, State, R... Server-side data... Microsoft.TeamFo...

Shared Steps        Microsoft.TeamFo... <FORM><Layout><G... {Title, State, R... Server-side data... Microsoft.TeamFo...


Suppose we want to create a bug:



$workitem = $bug.NewWorkItem()


Then we can change the properties of $workitem and finally save it by:




For tons of other things we can do, read MSDN doc:


Team Build


Firstly get a IBuildServer service:


$bs = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.Build.Client.IBuildServer")


Then we can use methods in IBuildServer to do various tasks.  For instance get a build definition:


PS C:\scxtfs\zzSandbox\zhyao\script\tfs> $bs.GetBuildDefinition("SC_Orchestration", "SCOMain")



BuildServer                      : Microsoft.TeamFoundation.Build.Client.BuildServer

BuildController                  : BuildController instance 40736959


TFS Integration Pack


As we see, by reading MSDN docs PowerShell can do many tasks with TFS client object model.  This requires you have a little bit knowledge of TFS and programming.  For internal people, you can just use TFS integration pack without writing a PowerShell script.  Here is the list of activities:


  • Work Item Tracking
    • Get Work Item
    • Query Work Items
    • Set Work Item
    • New Work Item
    • Monitor Work Items Query
  • Version control
    • List Version Control Items
    • Download File
    • Update Workspace
    • Check in
    • Check out
    • Get Changeset
  • Team Build
    • Get Build Definitions
    • Get Build Details
    • Request Build
    • Set Build Details
    • Monitor Build


Again, other than two monitor activities, everything can be done in PowerShell in a straightforward way.  It just a matter of tinkering with some lines of code.   If you need anything else, please don't hesitate to let me know and I will see how to make it work, either by PowerShell or new activities.

Comments (7)

  1. Svein Arne says:

    Any idea when this IP will become available?

  2. Poorly written blog.  Many omissions, presented code doesn't work actually syntactically incorrect.

  3. Svein: TFS IP is available on

    K-E-G: there are few typos during C&P.  I will fix it.  Please let me know which one doesn't work, I will take a look.  Thanks!

  4. typos fixed. I just verified scripts 🙂

  5. Unable to find type says:

    I'm getting an error early on:

    Unable to find type [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]: make sure that the assembly containing this type is loaded.

    At line:8 char:1

    + $teamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollecti …

  6. Brian Miller says:

    Hi!  I tried your example, but it didn't work for me.  I found that RegisteredTfsConnections is excellent for using pre-existing connections.

    Here's how to connect with PowerShell and VS 2012:



    $regProjCollection = [Microsoft.TeamFoundation.Client.RegisteredTfsConnections]::GetProjectCollection("tfs2010TFS2010-CollectionName")

    $tfsTeamProjCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($regProjCollection)

    $ws = $tfsTeamProjCollection.GetService([type]"Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore")


  7. Sanjay Nipane says:

    Thanks Zhenhua Yao, for good article. This is exactly what I was looking for. Actually I am running PowerShell script integrated with TFS Build definition for some clean-up and configuration key updates. Now, I want to check whether build has been failed or passed through the same script itself. Could you please tell me the exact APIs to be used for getting build failure.

    Thanks again.

Skip to main content