Определите локальный путь рабочей области TFS через tf.exe - PullRequest
5 голосов
/ 30 марта 2012

Я использую пакетный скрипт для получения последней версии конкретных проектов. Этот скрипт запускает только tf.exe и получает последнюю версию некоторых двоичных файлов. Все работает нормально, но я хотел бы изменить атрибут загружаемых файлов, чтобы они были доступны для записи (по умолчанию эти файлы доступны только для чтения). Для этого я хочу определить локальный путь к файлам и использовать команду attrib из пакета.

tf.exe workfold [Workspace] показывает мне локальный путь в каком-то листинге, но было бы проще, если бы он показывал только то, что я хочу, чтобы я мог использовать подсказку. До сих пор это выглядит так:

tf.exe workfold [Workspace]

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

Arbeitsbereich: XYZ-xxxxxx (Username)

Auflistung: TFS-URL

[Workspace]:  C:\xxx\TFS\xxx

Можно ли определить только локальное сопоставление пути рабочей области TFS, чтобы я мог использовать подсказку для команды attrib без разбора?

Ответы [ 3 ]

1 голос
/ 12 сентября 2016

Вы также можете сделать это без каких-либо манипуляций со строками, с помощью вызовов TF.exe. Я обернул это в сценарии PowerShell, так что вы получите следующее:

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.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer"
  Add-Type -Path "$PathToAssemblies\NewtonSoft.Json.dll"
  Add-Type -Path "$PathToAssemblies\System.Net.http.formatting.dll"
  Add-Type -Path "$PathToAssemblies\Microsoft.TeamFoundation.Client.dll"
  Add-Type -Path "$PathToAssemblies\Microsoft.TeamFoundation.Common.dll"
  Add-Type -Path "$PathToAssemblies\Microsoft.TeamFoundation.VersionControl.Client.dll"
  Add-Type -Path "$PathToAssemblies\Microsoft.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)
}

Вышеупомянутый метод может быть вызван так:

$serverFolderPath = Get-TfsServerPathFromLocalPath $folderPath -LoadTfsTypes
$anotherServerPath = Get-TfsServerPathFromLocalPath $anotherItemToTestPathOn
1 голос
/ 18 июня 2012

А как насчет следующей (грубой !!!) концепции?

function Get-TfsWorkfold([string]$TfsCollection, [string]$TfsWorkspace)
{
    $TfExePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 10.0\Common7\IDE\TF.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:\temp\test.txt
Select-String c:\temp\test.txt -pattern:': ' | Select-Object Line | Handle-Path

Последняя строка в Handle-Path - это пример, с которым вы можете переписать все, что захотите. Это PowerShell, но он должен работать так, как вы хотите.

Замените {serverAndcollection} и {рабочее пространство}.

0 голосов
/ 26 ноября 2015

Настоящие мужчины делают это в одну строку

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

Текущий ответ вернет только один последний путь, если их много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...