powershell - 使用 Powershell 从 TFS 源代码控制下载文件适用于任何地方,但构建定义
问题描述
我有一个我编写的 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. 在位置 #2 的服务器上的 TFS 2015 构建定义中
该脚本运行良好,并且在一个团队项目的所有 3 个位置都没有问题。然后我再次运行脚本,但将不同的团队项目传递给“Get-TFS”函数。它适用于位置 #1 和 #2,但不适用于位置 #3。我已经尝试了多个不同的团队项目(我们有几十个),到目前为止,它只在第一个的所有 3 个位置工作。所有其他仅适用于位置 #1 和 #2,但不适用于位置 #3。“不工作”是指它在构建定义中产生以下 PS 日志:
“没有为指定的项目和版本组合找到历史条目。”
(对于我的脚本中的代码,输出“0”字符,不带双引号字符:“Write-Output $items.Count”)
因此,在位置 #3 中运行时,它无法找到历史记录中的任何项目,即使它在位置 #1 和 #2 中运行时确实找到了项目并成功下载了它们。
知道为什么会这样吗?我怀疑这是某种权限问题,但我找不到任何东西,而且我觉得奇怪的是,如果是这种情况,它会在 2/3 的位置正常工作,而不是在所有 3 个位置都失败.
其他需要注意的重要细节:
1. 我已经仔细检查了几次,现在团队项目名称都拼写正确。
2. 变更集范围是正确的,并且确实包含要在我正在尝试的所有团队项目中在该范围内下载的文件。请记住,当我在位置 #1 和 #2 中运行脚本时,我会获得结果并成功下载文件。
3. 我意识到这可能是 TFS 2015 的一些奇怪错误,升级到 Azure 可能会很好地解决问题。我很想升级,但不幸的是,我在一个工作场所,那里的人坐在比我更大的桌子后面来决定升级的时间。他们正计划这样做,但与此同时,我仍然需要这样做或找到一些解决方法来让我度过难关。
更新:
我运行了以下行:
$PSVersionTable.PSVersion
在所有三个位置,结果如下:
位置 1:
主要:5
次要:1
构建:14409
修订:1018主要修订
:0
次要修订:1018
位置 2:
主要:5
次要:1
构建:14409
修订:1018
位置 3:
主要:5
次要:1内部版本
:14409
修订版:1018主要修订版
:0
次要修订版:1018
所以powershell版本都是一样的。那不是问题。
解决方案
推荐阅读
- javascript - 如何使用 (CSS/HTML/Javascript) 在 Hover 上添加带有动画的字母
- html - 如何确保跨度的内容在 CSS 中向右而不是向左增长
- c# - 无法将证书粘贴到受信任的根证书颁发机构存储中。访问被拒绝
- java - 为什么不能通过两个参数交换数组的两个元素?
- netcdf - NetCDF 重新排序维度
- reactjs - 从 React 中的表单发布方法获取响应
- php - 选择数据时子查询返回多于 1 行
- cmd - cd %C^ 在命令提示符中?
- javascript - 如何使用 Nodejs 和 APIGatewayProxyEvent 发送带有请求的文件
- python-3.x - 使用opencv遮蔽颜色