Public/Get-TFSWorkItem.ps1

Function Get-TFSWorkItem{
<#
    .Synopsis
      Please give your script a brief Synopsis,
    .DESCRIPTION
      A slightly longer description,
    .PARAMETER logLevel
        explain your parameters here. Create a new .PARAMETER line for each parameter,
        
    .EXAMPLE
        THis example runs the script with a change to the logLevel parameter.
 
        .Template.ps1 -logLevel Debug
 
    .INPUTS
       What sort of pipeline inputdoes this expect?
    .OUTPUTS
       What sort of pipeline output does this output?
    .LINK
       www.google.com
    #>

[CmdletBinding(SupportsShouldProcess=$true)] 
param([Parameter(ValueFromPipeline)] $pipelineInput
,[int] $WorkItemID)

$repositoryID = $pipelineInput.repository.id
function ConvertFrom-Json2{
<#
    .SYNOPSIS
        The ConvertFrom-Json cmdlet converts a JSON-formatted string to a custom object (PSCustomObject) that has a property for each field in the JSON
 
    .DESCRIPTION
        The ConvertFrom-Json cmdlet converts a JSON-formatted string to a custom object (PSCustomObject) that has a property for each field in the JSON
 
    .PARAMETER InputObject
        Specifies the JSON strings to convert to JSON objects. Enter a variable that contains the string, or type a command or expression that gets the string. You can also pipe a string to ConvertFrom-Json.
     
    .PARAMETER MaxJsonLength
        Specifies the MaxJsonLength, can be used to extend the size of strings that are converted. This is the main feature of this cmdlet vs the native ConvertFrom-Json2
 
    .EXAMPLE
        Get-Date | Select-Object -Property * | ConvertTo-Json | ConvertFrom-Json
     
        DisplayHint : 2
     
        DateTime : Friday, January 13, 2012 8:06:31 PM
     
        Date : 1/13/2012 8:00:00 AM
     
        Day : 13
     
        DayOfWeek : 5
     
        DayOfYear : 13
     
        Hour : 20
     
        Kind : 2
     
        Millisecond : 400
     
        Minute : 6
     
        Month : 1
     
        Second : 31
     
        Ticks : 634620819914009002
     
        TimeOfDay : @{Ticks=723914009002; Days=0; Hours=20; Milliseconds=400; Minutes=6; Seconds=31; TotalDays=0.83786343634490734; TotalHours=20.108722472277776; TotalMilliseconds=72391400.900200009; TotalMinutes=1206.5233483366667;TotalSeconds=72391.4009002}
     
        Year : 2012
     
        This command uses the ConvertTo-Json and ConvertFrom-Json cmdlets to convert a DateTime object from the Get-Date cmdlet to a JSON object.
 
        The command uses the Select-Object cmdlet to get all of the properties of the DateTime object. It uses the ConvertTo-Json cmdlet to convert the DateTime object to a JSON-formatted string and the ConvertFrom-Json cmdlet to convert the JSON-formatted string to a JSON object..
     
    .EXAMPLE
        PS C:\>$j = Invoke-WebRequest -Uri http://search.twitter.com/search.json?q=PowerShell | ConvertFrom-Json
     
        This command uses the Invoke-WebRequest cmdlet to get JSON strings from a web service and then it uses the ConvertFrom-Json cmdlet to convert JSON content to objects that can be managed in Windows PowerShell.
 
        You can also use the Invoke-RestMethod cmdlet, which automatically converts JSON content to objects.
        Example 3
        PS C:\>(Get-Content JsonFile.JSON) -join "`n" | ConvertFrom-Json
     
        This example shows how to use the ConvertFrom-Json cmdlet to convert a JSON file to a Windows PowerShell custom object.
 
        The command uses Get-Content cmdlet to get the strings in a JSON file. It uses the Join operator to join the strings in the file into a single string that is delimited by newline characters (`n). Then it uses the pipeline operator to send the delimited string to the ConvertFrom-Json cmdlet, which converts it to a custom object.
 
        The Join operator is required, because the ConvertFrom-Json cmdlet expects a single string.
 
    .NOTES
        Author: Reddit
        Version History:
            1.0 - Initial release
        Known Issues:
            1.0 - Does not convert nested objects to psobjects
    .LINK
#>


[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Low')]

param
(  
    [parameter(
        ParameterSetName='object',
        ValueFromPipeline=$true,
        Mandatory=$true)]
        [string]
        $InputObject,
    [parameter(
        ParameterSetName='object',
        ValueFromPipeline=$true,
        Mandatory=$false)]
        [int]
        $MaxJsonLength = 67108864

)#end param

BEGIN 
{ 
    
    #Configure json deserializer to handle larger then average json conversion
    [void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions')        
    $jsonserial= New-Object -TypeName System.Web.Script.Serialization.JavaScriptSerializer 
    $jsonserial.MaxJsonLength  = $MaxJsonLength

} #End BEGIN

PROCESS
{
    if ($PSCmdlet.ParameterSetName -eq 'object')
    {
        $deserializedJson = $jsonserial.DeserializeObject($InputObject)

        # Convert resulting dictionary objects to psobjects
        foreach($desJsonObj in $deserializedJson){
            $psObject = New-Object -TypeName psobject -Property $desJsonObj

            $dicMembers = $psObject | Get-Member -MemberType NoteProperty
            
            foreach ($member in $dicMembers){
                $member.GetType()
                if ($member -is [System.Collections.Generic.Dictionary`2])
                {
                    $psObject.$member = New-Object -TypeName psobject -Property $psObject.$member
                    $a = 0;
                }
                $x = 0;
            }
            # Need to recursively go through members of the originating psobject that have a .GetType() Name of 'Dictionary`2'
            # and convert to psobjects and replace the current member in the $psObject tree

            $psObject
        }
    }


}#end PROCESS

END
{
}#end END

}
if ([String]::IsNullOrEmpty($repositoryID)){
    Write-Log "Please pass a repositoryID" Error -ErrorAction Stop
}
$BaseTFSURL = Get-TFSRestURL_Collection
$action = "/wit/workitems/$($workItemID)?api-version=$($script:apiVersion)" 
$fullURL = $BaseTFSURL + $action
Write-Log "URL we are calling: $fullURL" Debug
$outputObj = $pipelineInput

try{
$response = Invoke-RestMethod -UseDefaultCredentials -uri $fullURL -Method Get -ContentType "application/json"
$json = $response
$x = 0;
}
catch{
    $ex = $_.Exception
    if ($ex.response -ne $null){
    $errResponse = $ex.Response.GetResponseStream()
    $reader = New-Object System.IO.StreamReader($errResponse) 
     $reader.BaseStream.Position = 0 
     $reader.DiscardBufferedData() 
     $responseBody = $reader.ReadToEnd(); 
     $responseBody 
     }

    $line = $_.InvocationInfo.ScriptLineNumber
    $scriptName = Split-Path $_.InvocationInfo.ScriptName -Leaf
    $msg = $ex.Message
    Write-Log "Error in script $scriptName at line $line, error message: $msg" Warning
}
if([bool]($outputObj.PSobject.Properties.name -match "WorkItems")){
    $outputObj.WorkItems += $json
}
else{
    $outputObj | Add-Member -Type NoteProperty -Name WorkItems -Value $json
}
Write-Output $outputObj

}Export-ModuleMember -Function Get-TFSWorkItem