windows - Bestem lokal vej for et TFS-arbejdsområde via tf.exe

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger et batch script til at få den nyeste version af specifikke projekter. Dette script kører kun tf.exe og får den nyeste version af nogle binære filer. Alt fungerer fint, men jeg vil gerne ændre attributten for de downloadede filer, der kan skrives (ved deafult er disse filer kun skrivebeskyttet). For det vil jeg gerne bestemme den lokale sti for filerne og bruge attrib-kommandoen fra batch.


tf.exe workfold [[Workspace]] viser mig den lokale sti i en slags notering, men det ville være lettere, hvis det kun viser mig, hvad jeg vil, så jeg kan bruge prompten. Indtil nu ser det sådan ud:


tf.exe workfold [Workspace]

=======================================

Arbeitsbereich: XYZ-xxxxxx (Username)

Auflistung: TFS-URL

[Workspace]:  C:xxxTFSxxx


Er det muligt kun at bestemme den lokale bane-kortlægning af et TFS-arbejdsområde, så jeg kan bruge prompt til attrib-kommandoen uden at analysere?

Bedste reference


Hvad med følgende (rå !!!) koncept?


function Get-TfsWorkfold([string]$TfsCollection, [string]$TfsWorkspace)
{
    $TfExePath = "${env:ProgramFiles(x86)}Microsoft Visual Studio 10.0Common7IDETF.exe"
    Write-Output "Getting workfold for '$TfsCollection'->'$TfsWorkspace'..."
    Push-Location $LocalPath
    & "$TfExePath" workfold /collection:$TfsCollection /workspace:$TfsWorkspace
}

function Handle-Path()
{
    param([Parameter(ValueFromPipeline=$true,Position=0)] [string] $line)
    $startIndex = $line.IndexOf(': ') + 2;
    $correctedLine = $line.subString($startIndex, $line.length - $startIndex - 1);
    Write-Output $correctedLine;
    Get-ChildItem $correctedLine
}

Get-TfsWorkfold "{serverAndcollection}"  "{workspace}" > c:	emp	est.txt
Select-String c:	emp	est.txt -pattern:': ' | Select-Object Line | Handle-Path


Den sidste linje i Handle-Path er eksemplet, som du kan rewirte med hvad du vil. Det er PowerShell, men det skal fungere som du vil.


Udskift {serverAndcollection} og {arbejdsområde}.

Andre referencer 1


Du kan også gøre det uden nogen streng manipulation, med opkald til TF.exe. Jeg har pakket det i PowerShell scripts, så du får følgende:


function Add-TfsTypes
{
  # NOTE: Not all of the below are needed, but these are all the assemblies we load at the moment. Please note that especially NewtonSoft dll MUST be loaded first!
  $PathToAssemblies = "C:Program Files (x86)Microsoft Visual Studio 14.0Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer"
  Add-Type -Path "$PathToAssembliesNewtonSoft.Json.dll"
  Add-Type -Path "$PathToAssembliesSystem.Net.http.formatting.dll"
  Add-Type -Path "$PathToAssembliesMicrosoft.TeamFoundation.Client.dll"
  Add-Type -Path "$PathToAssembliesMicrosoft.TeamFoundation.Common.dll"
  Add-Type -Path "$PathToAssembliesMicrosoft.TeamFoundation.VersionControl.Client.dll"
  Add-Type -Path "$PathToAssembliesMicrosoft.TeamFoundation.WorkItemTracking.Client.dll"
}

function Get-TfsServerPathFromLocalPath {
  param(
    [parameter(Mandatory=$true)][string]$LocalPath,
    [switch]$LoadTfsTypes
  )

  if ($LoadTfsTypes) {
    Add-TfsTypes # Loads dlls
  }

  $workspaceInfo = [Microsoft.TeamFoundation.VersionControl.Client.Workstation]::Current.GetLocalWorkspaceInfo($LocalPath)
  $server = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection $workspaceInfo.ServerUri
  $workspace = $workspaceInfo.GetWorkspace($server)

  return $workspace.GetServerItemForLocalItem($LocalPath)
}


Ovennævnte metode kan så kaldes som dette:


$serverFolderPath = Get-TfsServerPathFromLocalPath $folderPath -LoadTfsTypes
$anotherServerPath = Get-TfsServerPathFromLocalPath $anotherItemToTestPathOn

Andre referencer 2


Ægte mænd gør det i en linje


powershell -command "& {tf workfold | Select-String -pattern:' $' -SimpleMatch | Select-Object Line | ForEach-Object {$startIndex = $\_.Line.IndexOf(': ') + 2; $\_.Line.subString($startIndex, $\_.Line.length - $startIndex - 1)}}"


Nuværende svar vil kun returnere en sidste vej, hvis der er mange.