Определите локальный путь рабочей области TFS через tf.exe
Я использую пакетный скрипт для получения последней версии конкретных проектов. Этот скрипт выполняет только tf.exe и получает последние версии некоторых программ. Все работает нормально, но я хотел бы изменить attrib загруженных файлов, чтобы они были доступны для записи (по deafult эти файлы доступны только для чтения). Для этого я хочу определить локальный путь файлов и использовать команду attrib-из пакета.
Tf.exe workfold [Workspace] показывает мне локальный путь в каком-то списке, но он было бы проще, если бы он только показал мне, что я хочу, чтобы я мог использовать подсказку. До сих пор это выглядит так:
tf.exe workfold [Workspace]
=======================================
Arbeitsbereich: XYZ-xxxxxx (Username)
Auflistung: TFS-URL
[Workspace]: C:xxxTFSxxx
Можно ли определить только локальное отображение пути рабочей области TFS, чтобы я мог использовать приглашение для команды attrib без разбора?
3 ответов:
Как насчет следующего (грубо!!!) концепция?
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} и {workspace}.
Вы также можете сделать это без каких-либо манипуляций со строками, с вызовами 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
Настоящие мужчины делают это в одну линию
powershell -command "& {tf workfold | Select-String -pattern:' $' -SimpleMatch | Select-Object Line | ForEach-Object {$startIndex = $_.Line.IndexOf(': ') + 2; $_.Line.subString($startIndex, $_.Line.length - $startIndex - 1)}}"Текущий ответ вернет только один последний путь, если их много.
Comments