Public/Update-Symbols.ps1

function Update-Symbols {
    [CmdletBinding()]
    param (
        [parameter(Mandatory, ValueFromPipeline)]
        [FileInfo]$pdb,
        [parameter(Mandatory)]
        [string]$TargetRoot,
        [parameter()]
        [string]$SourcesRoot,
        [parameter()]
        [string]$dbgToolsPath = "$PSScriptRoot\srcsrv"
    )
    
    begin {
        if (!(test-path $dbgToolsPath)) {
            throw "srcsrv is invalid"
        }
        $remoteTarget = ($TargetRoot -like "http*")
        $list = New-Object System.Collections.ArrayList
    }
    
    process {
        $list.Add($pdb)|Out-Null
    }
    
    end {
        $list|Invoke-Parallel -ImportVariables {
            Write-Verbose "Indexing $($_.FullName) ..."
        
            $streamPath = [System.IO.Path]::GetTempFileName()
            Write-Verbose "Preparing stream header section..."
            Add-Content -value "SRCSRV: ini ------------------------------------------------" -path $streamPath
            Add-Content -value "VERSION=1" -path $streamPath
            Add-Content -value "INDEXVERSION=2" -path $streamPath
            Add-Content -value "VERCTL=Archive" -path $streamPath
            Add-Content -value ("DATETIME=" + ([System.DateTime]::Now)) -path $streamPath

            Write-Verbose "Preparing stream variables section..."
            Add-Content -value "SRCSRV: variables ------------------------------------------" -path $streamPath
        
            if ($remoteTarget) {
                Add-Content -value "SRCSRVVERCTRL=http" -path $streamPath
            }
            Add-Content -value "SRCSRVTRG=%var2%" -path $streamPath
            Add-Content -value "SRCSRVCMD=" -path $streamPath

            Write-Verbose "Preparing stream source files section..."
                
            $sources = & "$dbgToolsPath\srctool.exe" -r $_.FullName |Select-Object -SkipLast 1
            if (!$sources) {
                write-warning "No steppable code in pdb file $_, skipping";
                return;
            }

            Add-Content -value "SRCSRV: source files ---------------------------------------" -path $streamPath
            foreach ($src in $sources) {
                $target = "$src*$TargetRoot\$src"
                if ($remoteTarget) {
                    $file = "$src".replace($SourcesRoot, '').Trim("\").replace("\", "/")
                    $target = "$src*$TargetRoot/$file"
                }
                Add-Content -value $target -path $streamPath
                Write-Verbose "Indexing source to $target"
            }
            Add-Content -value "SRCSRV: end ------------------------------------------------" -path $streamPath
                
            $pdbstrPath = "$dbgToolsPath\pdbstr.exe"
            Write-Verbose "Saving the generated stream into the PDB file..."
            & $pdbstrPath -w -s:srcsrv "-p:$($_.Fullname)" "-i:$streamPath"
            Write-Verbose "Done."
            Remove-Item $streamPath
            Write-host $_ -ForegroundColor White
        }
    }
}