Как проверить файл в TFS с помощью PowerShell?

Ниже у меня есть сценарий PowerShell, написанный для извлечения файлов в TFS, ссылаясь на путь, указанный в файле TFS Path.txt.

         #$TFSCheckoutExe="C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe"
    $TFSFilePaths=Get-Content "$PSScriptRoot\TFS Path.txt" 
    $TFSCheckoutExe="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\TF.exe"
    
    
    $visualStudiopath = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer'
        Add-Type -Path "$visualStudiopath\Microsoft.TeamFoundation.VersionControl.Client.dll"
        Add-Type -Path "$visualStudiopath\Microsoft.TeamFoundation.Common.dll"
        Add-Type -Path "$visualStudiopath\Microsoft.TeamFoundation.WorkItemTracking.Client.dll"
        Add-Type -Path "$visualStudiopath\Microsoft.TeamFoundation.Client.dll"
        Add-type -path "$visualStudiopath\Microsoft.TeamFoundation.ProjectManagement.dll"
        Add-Type -Path "$visualStudiopath\Microsoft.TeamFoundation.Build.Common.dll"
    
#TFS Collection Path
$sourceLocation = "http://vwmaztfsapp:8080/tfs/MatchCollection"

#Creating TFS Object 
$tfsCollectionUrl = New-Object System.URI($sourceLocation);
    
    $tfsCollection = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $tfsCollectionUrl  
    
    $VersionControl = $tfsCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])  
    $latest = [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest  
    $recursionType = [Microsoft.TeamFoundation.VersionControl.Client.RecursionType]::Full 
    
    Foreach($TFSFilePath in $TFSFilePaths)
    {
          &$TFSCheckoutExe checkout $TFSFilePath | Out-Null 
    }

Я получаю сообщение об ошибке при извлечении файла в TFS? (скриншот ниже)

Может ли кто-нибудь сообщить мне, как я могу решить эту ошибку, что мне не хватает?

1 ответ

Чтобы получить файл, вам сначала нужно сопоставление рабочей области. Для извлечения файла это должно быть сопоставление сервера, локальные рабочие области не имеют опции извлечения.

tf vc workspace new /noprompt YourUniqueNameHere /location:server

Затем сопоставьте свою локальную папку с сервером в репозитории TFVC.

tf vc workfold /map $/Project/Path c:\A\Local\Directory /workspace YourUniqueNameHere 

Тогда позвони get или же checkout. Я не на 100%, вы можете проверить файл, не получив его предварительно.

Вы можете добиться того же, не полагаясь на tf.exeв чистом PowerShell. Вы можете найти полный пример в моих задачах TFVC для Azure Pipelines.Для этого вам по-прежнему нужно локальное рабочее пространство:

[string[]] $FilesToCheckout = $ItemSpec -split ';|\r?\n'
$RecursionType = [Microsoft.TeamFoundation.VersionControl.Client.RecursionType]$Recursion

Write-Message "Checking out ItemSpec: $ItemSpec, Recursive: $RecursionType"

Try
{
    $provider = Get-SourceProvider
    if (-not $provider)
    {
        return;
    }

    Foreach ($change in $FilesToCheckout)
    {
        Write-Message "Checking out: $change"
        
        $provider.Workspace.PendEdit(
            @($change),
            $RecursionType,
            $null,
            [Microsoft.TeamFoundation.VersionControl.Client.LockLevel]"Unchanged"
        )  | Out-Null
    }
}
Finally
{
    Invoke-DisposeSourceProvider -Provider $provider
}

Код для поиска рабочей области из кеша локальной рабочей области можно найти в общем модуле:

function Get-TfsTeamProjectCollection()
{
    $ProjectCollectionUri = Get-VstsTaskVariable -Name "System.TeamFoundationCollectionUri" -Require
    $tfsClientCredentials = Get-VstsTfsClientCredentials -OMDirectory $(Find-VisualStudio)
        
    $collection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection(
        $ProjectCollectionUri,
        $tfsClientCredentials)
    $collection.EnsureAuthenticated()

    return $collection
}

function Get-SourceProvider {
    [cmdletbinding()]
    param()

    Write-Debug "Entering Get-SourceProvider"
    $provider = @{
        Name = $env:BUILD_REPOSITORY_PROVIDER
        SourcesRootPath = $env:BUILD_SOURCESDIRECTORY
        TeamProjectId = $env:SYSTEM_TEAMPROJECTID
    }
    $success = $false
    try {
        if ($provider.Name -eq 'TfsVersionControl') {
            $provider.TfsTeamProjectCollection = Get-TfsTeamProjectCollection

            $versionControlServer = $provider.TfsTeamProjectCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
            $versionControlServer.add_NonFatalError($OnNonFatalError)
            
            $workstation = [Microsoft.TeamFoundation.VersionControl.Client.Workstation]::Current
            $workstation.EnsureUpdateWorkspaceInfoCache($versionControlServer, $versionControlServer.AuthorizedUser)

            $provider.VersionControlServer = $versionControlServer;
            $provider.Workspace = $versionControlServer.TryGetWorkspace($provider.SourcesRootPath)

            if (!$provider.Workspace) {
                Write-Message -Type Debug "Unable to determine workspace from source folder: $($provider.SourcesRootPath)"
                Write-Message -Type Debug "Attempting to resolve workspace recursively from locally cached info."
                
                $workspaceInfos = $workstation.GetLocalWorkspaceInfoRecursively($provider.SourcesRootPath);
                if ($workspaceInfos) {
                    foreach ($workspaceInfo in $workspaceInfos) {
                        Write-Message -Type Debug "Cached workspace info discovered. Server URI: $($workspaceInfo.ServerUri) ; Name: $($workspaceInfo.Name) ; Owner Name: $($workspaceInfo.OwnerName)"
                        try {
                            $provider.Workspace = $versionControlServer.GetWorkspace($workspaceInfo)
                            break
                        } catch {
                            Write-Message -Type Debug "Determination failed. Exception: $_"
                        }
                    }
                }
            }

            if ((!$provider.Workspace) -and $env:BUILD_REPOSITORY_TFVC_WORKSPACE) {
                Write-Message -Type Debug "Attempting to resolve workspace by name: $env:BUILD_REPOSITORY_TFVC_WORKSPACE"
                try {
                    $provider.Workspace = $versionControlServer.GetWorkspace($env:BUILD_REPOSITORY_TFVC_WORKSPACE, '.')
                } catch [Microsoft.TeamFoundation.VersionControl.Client.WorkspaceNotFoundException] {
                    Write-Message -Type Debug "Workspace not found."
                } catch {
                    Write-Message -Type Debug "Determination failed. Exception: $_"
                }
            }

            if (!$provider.Workspace) {
                Write-Message -Type Warning (Get-LocalizedString -Key 'Unable to determine workspace from source folder ''{0}''.' -ArgumentList $provider.SourcesRootPath)
                return
            }

            if ($provider.Workspace.Location -eq "Server")
            {
                Write-Warning "Server workspace support is experimental."
            }

            $provider.Workspace.Refresh()

            $success = $true
            return New-Object psobject -Property $provider
        }

        Write-Warning ("Only TfsVersionControl source providers are supported for TFVC tasks. Repository type: $provider")
        return
    } finally {
        if (!$success) {
            Invoke-DisposeSourceProvider -Provider $provider
        }
        Write-Message -Type Debug "Leaving Get-SourceProvider"
    }

Этот код должен содержать достаточно информации для создания нового рабочего пространства, если вы этого хотите.

Другие вопросы по тегам