У меня есть сценарий PS, который я написал, который загружает файлы из системы контроля версий из командного проекта. Сценарий выглядит следующим образом:
function Clear-Folder
{
Param ([string]$directory)
try
{
if ((Test-Path -Path $directory -PathType Container))
{
Write-Output "INFO: Clearing directory: $directory"
Remove-Item -Path "$directory\*" -Recurse -Force -Verbose -ErrorVariable exClear -ErrorAction Stop
}
else
{
Write-Output "INFO: Directory: $directory does not exist, so it is being created."
New-Item -Path $directory -ItemType Directory -Force -Verbose -ErrorVariable exClear -ErrorAction Stop
Write-Output "INFO: Directory: $directory successfully created."
}
}
catch
{
Write-Output "ERROR: $exClear"
}
}
Add-PSSnapin Microsoft.TeamFoundation.PowerShell
function Get-TFS
{
Param ([string]$TeamProjectName)
$tfsCollectionPath = 'http://ourtfsserver/tfs/DefaultCollection'
[Microsoft.TeamFoundation.Client.TfsTeamProjectCollection] $tfs = Get-TfsServer $tfsCollectionPath
$tfsCollection = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $tfsCollectionPath
$tfsVersionControl = $tfsCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
$locationToSearch = "$/$TeamProjectName/"
$sourceFolder = "C:\$TeamProjectName"
Clear-Folder -directory $sourceFolder
$items = Get-TfsItemHistory -HistoryItem $locationToSearch -Recurse -Server $tfs -Version '1084892~1084927' -IncludeItems |
Select-Object -Expand "Changes" |
Where-Object { $_.ChangeType -notlike '*Delete*'} |
Where-Object { $_.ChangeType -notlike '*Rename*'} |
Select-Object -Expand "Item" |
Where-Object { $_.ContentLength -gt 0}
Write-Output $items.Count
foreach ($item in $items)
{
Write-Output $item
$itemFullName = $item.ServerItem
Write-Output $itemFullName
try
{
$path = $itemFullName.Replace($locationToSearch, "$sourceFolder\")
$path = $path.Replace('/', '\')
Write-Output $locationToSearch
Write-Output $sourceFolder
Write-Output $path
Write-Output "INFO: Downloading file: $itemFullName to: $path"
$tfsVersionControl.DownloadFile($itemFullName, $path)
}
catch [System.Exception]
{
$exceptionMessage = $_.Exception.message
Write-Output "ERROR: Downloading file: $itemFullName to: $path failed; exception message: $exceptionMessage"
}
}
}
Get-TFS -TeamProjectName 'A'
Get-TFS -TeamProjectName 'B'
Get-TFS -TeamProjectName 'C'
Я запускаю этот скрипт в трех местах:
1. локально на моей машине во время первоначальной разработки скриптов и тестирования
2. Сервер с ОС: Windows Server 2012 R2
3. В определении сборки TFS 2015 на сервере в расположении # 2
Скрипт работает просто отлично и не имеет проблем во всех трех местах для одного командного проекта. Затем я снова запускаю сценарий, но с передачей другого командного проекта в функцию «Get-TFS». Это работает для местоположений # 1 и # 2, но не для местоположения # 3. Я пробовал это с несколькими различными командными проектами (у нас их десятки), и до сих пор он работал только во всех трех местах для первого. Все остальные работают только для локаций № 1 и № 2, но не для локации № 3. И под "не работает" я специально имею в виду, что он производит следующий журнал PS в определении сборки:
"Не найдено записей истории для указанной комбинации элемента и версии."
(Также выводится символ «0» без символов двойных кавычек для кода в моем скрипте: «Write-Output $ items.Count»)
Таким образом, он не может найти какие-либо элементы в истории при запуске в местоположении # 3, хотя он действительно находил и успешно загружал их при запуске в местоположениях # 1 и # 2.
Есть идеи, почему это происходит? Я подозреваю, что это какая-то проблема с разрешениями, но я не смог ничего найти, и я нахожу странным, что он будет работать нормально в 2/3 местоположений вместо сбоя во всех 3, если это имело место. .
Другие важные детали для заметки:
1. Теперь я несколько раз тщательно проверял, правильно ли написаны имена командных проектов.
2. Диапазон изменений является правильным и содержит файлы для загрузки в этом диапазоне в всех командных проектов, для которых я пытаюсь это сделать. Помните, что я получаю результаты и успешно загружаю файлы, когда запускаю скрипт в местах № 1 и № 2.
3. Я понимаю, что это может быть какой-то странной ошибкой в TFS 2015, и что обновление до Azure вполне может решить эту проблему. Я хотел бы обновить, но, к сожалению, я нахожусь на рабочем месте, и есть люди, которые сидят за большими столами, чем я, которые решают, когда произойдет обновление. Они планируют это сделать, но в то же время мне все еще нужно сделать это или найти какой-то обходной путь, чтобы меня обойти.
UPDATE:
Я запустил следующую строку:
$ PSVersionTable.PSVersion
во всех трех местах со следующими результатами:
Местоположение 1:
Major: 5
Несовершеннолетний: 1
Телосложение: 14409
Редакция: 1018
MajorRevision: 0
MinorRevision: 1018
Местоположение 2:
Major: 5
Несовершеннолетний: 1
Телосложение: 14409
Редакция: 1018
Местоположение 3:
Major: 5
Несовершеннолетний: 1
Телосложение: 14409
Редакция: 1018
MajorRevision: 0
MinorRevision: 1018
Так что версии powershell все одинаковые. Это не проблема.