QueryWorkspaces返回空数组但存在工作空间

时间:2012-11-29 16:17:13

标签: tfs2010 powershell-v2.0

很简单,我试图通过在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管理员权限。

2 个答案:

答案 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被解释为""