Powershell: командлет Update-TfsWorkspace, как обновить два рабочих пространства

Я хочу обновить 2 рабочих пространства из двух разных tfs в одном скрипте, используя powershell. Первое рабочее пространство обновляется без проблем. После завершения обновления powershell подключается ко второму рабочему пространству, но не обновляет локальные данные, как в первый раз.

Я предполагаю, что старое соединение все еще может блокировать канал или что-то в этом роде, но я не нашел cmd для очистки канала. Мой код выглядит так:

param(
      [string]$TestTFS = "http://TestTFS",
      [string]$ProdTFS = "http://ProdTFS",
      [string]$Teamproject="$\TeamprojectPath",
      [string]$LocalTestWorkspace="C:\LocalTestWorkspacePath",
      [string]$LocalProdWorkspace="C:\LocalProdWorkspacePath"
     )

# Import Microsoft.TeamFoundation.PowerShell Snapin
Add-PSSnapin Microsoft.TeamFoundation.PowerShell

# Connect to production-TFS
$ProdEnvServer = Get-TfsServer -Name $ProdTFS
Write-Host "tfsConnect ="$ProdEnvServer

# Get prod teamprojekt
Get-TfsChildItem $Teamprojekt -Server $ProdEnvServer

# Update files in local prod workspace
Update-TfsWorkspace -Force -Recurse $LocalProdWorkspace


# Connect to test-TFS
$TestEnvServer = Get-TfsServer -Name $TestTFS
Write-Host "tfsConnect ="$TestEnvServer

# Get test teamprojekt
Get-TfsChildItem $Teamprojekt -Server $TestEnvServer

# Update files in local test workspace
Update-TfsWorkspace -Force -Recurse $LocalTestWorkspace

3 ответа

Решение

Через 3 месяца никто не придумал ответа. Я просто предполагаю, что командлеты работают не так, как должны. Единственный вариант здесь, кажется, Обходной путь.

# Copy Team Project from Prod to Test TFS

param([string]$TestTFS = "http://TestTFS",
[string]$ProdTFS = "http://ProdTFS",
[String]$Teamproject="$/Teamproject",
[String]$LocalTestWorkspace="C:\LocalTestWorkspacePath",
[String]$LocalProdWorkspace="C:\LocalProdWorkspacePath")

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")

try 
{
clear

$LocalTestProjectPath = $LocalTestWorkspace + $Teamproject.Substring(1)
$LocalProdProjectPath = $LocalProdWorkspace + $Teamproject.Substring(1)

# Connect to production-TFS
Write-Host "Getting latest of $ProdTFS"
$tfsColProd = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($ProdTFS)
[Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer] $vcsProd = $tfsColProd.GetService([type] "Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer")

# TryGetWorkspace is sometimes buggy and doesn't return an existing workspace
# Delete existing workspace manually before if that happens
$workspaceProd = $vcsProd.TryGetWorkspace($LocalProdWorkspace)

$isProdTempWorkspace = $false

# create Workspace if it doesn't exists
if (-not $workspaceProd) {
    Write-Host "No workspace found, creating temporary for prod"
    $workspaceProd = $vcsProd.CreateWorkspace("Temp_" + [System.Guid]::NewGuid().ToString())
    $workspaceProd.Map($Teamproject, $LocalProdProjectPath)
    $isProdTempWorkspace = $true
}

$itemSpecFullTeamProj = New-Object Microsoft.TeamFoundation.VersionControl.Client.ItemSpec($Teamproject, "Full")
$fileRequest = New-Object Microsoft.TeamFoundation.VersionControl.Client.GetRequest($itemSpecFullTeamProj, 
    [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest)

$workspaceProd.Get($fileRequest, [Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::GetAll)

if ($isProdTempWorkspace) {
    Write-Host "Deleting temporary workspace for prod"
    $workspaceProd.Delete()
}

Write-Host "Getting latest of $TestTFS"
$tfsColTest = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($TestTFS)
$vcsTest = $tfsColTest.GetService([type] "Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer")

# TryGetWorkspace is sometimes buggy and doesn't return an existing workspace
# Delete existing workspace manually before if that happens
[Microsoft.TeamFoundation.VersionControl.Client.Workspace] $workspaceTest = $vcsTest.TryGetWorkspace($LocalTestWorkspace)
$isTestTempWorkspace = $false

# create Workspace if it doesn't exists
if (-not $workspaceTest) {
    Write-Host "No workspace found, creating temporary for test"
    $workspaceTest = $vcsTest.CreateWorkspace("Temp_" + [System.Guid]::NewGuid().ToString())
    $workspaceTest.Map($Teamproject, $LocalTestProjectPath)
    $isTestTempWorkspace = $true
}

$workspaceTest.Get($fileRequest, [Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::GetAll)

# Remove local test folder and copy prod folder into test workspace
Write-Host "Copying over Prod to Test"

# Delete updated test project folder 
Remove-Item -Path $LocalTestProjectPath -Force -Recurse

# Copy prod folder to test workspace
Copy-Item -Path $LocalProdProjectPath -Destination $LocalTestProjectPath -Force -Recurse

# Calling tfpt is the only thing that works
Write-Host "Comparing for changes"
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.Filename = $env:TFSPowerToolDir + "tfpt.exe"
$ps.StartInfo.Arguments = "online /adds /deletes /diff /noprompt /recursive $LocalTestProjectPath"
$ps.StartInfo.RedirectStandardOutput = $false # careful, only output works, has hanging problems (2k Buffer limit)
$ps.StartInfo.RedirectStandardError = $false 
$ps.StartInfo.UseShellExecute = $false
$ps.Start()
$ps.WaitForExit()

# Check in new test project folder into test environment
$wsCheckinParams = New-Object Microsoft.TeamFoundation.VersionControl.Client.WorkspaceCheckInParameters(
    @($itemSpecFullTeamProj),"Update project to production environment version")
# CheckIn better manually to check for errors
$workspaceTest.CheckIn($wsCheckinParams)


if ($isTestTempWorkspace) {
   Write-Host "Deleting temporary workspace for test"
   $workspaceTest.Delete()
   Remove-Item -Path D:\Development -Force -Recurse
}
}

catch [System.Exception]
{
   Write-Host "Exception: " ($Error[0]).Exception 
   EXIT $LASTEXITCODE
}

Мой подход очень похож на Zittelrittel. Просто отправьте путь, и он автоматически определит рабочее пространство.

Это не будет работать в PowerShell ISE (x86), мне пришлось использовать 64-разрядную версию!

Add-PSSnapin Microsoft.TeamFoundation.PowerShell

Write-Host "Updating Workspace1, please wait..."
Update-TfsWorkspace -item C:\dev\Workspace1\code -Recurse | Format-Table

Write-Host "Updating Workspace2, please wait..."
Update-TfsWorkspace -item C:\dev\Workspace1\code -Recurse | Format-Table

В ваших вызовах по обновлению рабочей области TFS направьте результат в out-null. Это должно эффективно удалить любые данные, которые в противном случае были бы сохранены в конвейере.

Update-TfsWorkspace -Force -Recurse $LocalProdWorkspace | Out-Null
Update-TfsWorkspace -Force -Recurse $LocalTestWorkspace | Out-Null
Другие вопросы по тегам