很简单,我试图通过在powershell中调用VersionControlServer类的QueryWorkspaces方法来获取工作空间列表。我将null传递给参数,根据文档,它应该给我一个工作区列表。
如果我将工作空间命名为工作正常并返回单个工作空间,但文档中说空名称应该为所有工作空间提供。
function Get-Workspace
{
param
(
[Parameter(Mandatory=$true)]
[string]$TeamProjectCollection,
[string]$Owner,
[string]$Computer,
[parameter(ValueFromPipeline=$true)]
[string]$Name
)
begin
{
[Microsoft.TeamFoundation.Client.TfsTeamProjectCollection]$tfsTeamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($TeamProjectCollection)
[Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer]$versionControlServer = $tfsTeamProjectCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
}
process
{
Write-Output $versionControlServer.QueryWorkspaces($Name, $Owner, $Computer)
}
}
我正在运行Project Collection管理员权限。
答案 0 :(得分:2)
问题似乎是当.net类期望字符串时,PowerShell不会将null传递为null。在PowerShell层的某处,null被转换为空字符串。这阻止了返回所有工作空间的代码路径执行。相反,它试图匹配一个名为“”的工作区。
问题的详细信息位于Microsoft Connect article,报告了要在PowerShell 3.0中修复的问题。
知道问题是什么以及如何修复它的提示我开始沿着Reflection路线。然而,这变得更加复杂,因为QueryWorkspaces方法被重载,因此对GetType的简单调用引发了异常。尝试将类型数组传递给GetType调用失败,因为PowerShell将其作为Object数组而不是Type数组传递。因此必须长时间地完成......
function Get-Workspace
{
param
(
[Parameter(Mandatory=$true)]
[string]$TeamProjectCollection,
[string]$Owner,
[string]$Computer,
[parameter(ValueFromPipeline=$true)]
[string]$Name
)
begin
{
[Microsoft.TeamFoundation.Client.TfsTeamProjectCollection]$tfsTeamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($TeamProjectCollection)
[Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer]$versionControlServer = $tfsTeamProjectCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
[array]$methods = $versionControlServer.GetType().GetMethods()
[System.Reflection.MethodInfo]$methodToInvoke = $null
foreach($method in $methods)
{
if ($method.Name -eq "QueryWorkspaces")
{
if ($method.GetParameters().Length -eq 3)
{
$methodToInvoke = $method
}
}
}
}
process
{
if ([string]::IsNullOrEmpty($Name))
{
$params = @($null, $Owner, $Computer)
Write-Output $methodToInvoke.Invoke($versionControlServer, $params)
}
else
{
Write-Output $versionControlServer.QueryWorkspaces($Name, $userName, $computerName)
}
}
}
答案 1 :(得分:-1)
是否曾使用$null
传递
[System.Management.Automation.Language.NullString]::Value
而不是$null
(PowerShell无法正确处理此问题,$null
被解释为""
)