Как проверить файл в 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"
}
Этот код должен содержать достаточно информации для создания нового рабочего пространства, если вы этого хотите.