2012-03-30 2 views
4

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

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

tf.exe workfold [Workspace] 

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

Arbeitsbereich: XYZ-xxxxxx (Username) 

Auflistung: TFS-URL 

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

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

ответ

0

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

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}.

0

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

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

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

+0

Это было здорово, но ошибка как -1 в разрезах подстроки от последнего символа пути '$ _. Line.subString ($ startIndex, $ _. Line.length - $ startIndex)' – SlaterCodes

1

Вы также можете сделать это без каких-либо строковых манипуляций с вызовами 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 
Смежные вопросы