1

簡単に言うと、PowerShellでVersionControlServerクラスのQueryWorkspacesメソッドを呼び出して、ワークスペースのリストを取得しようとしています。パラメータにnullを渡しており、ドキュメントによると、ワークスペースのリストが表示されるはずです。

ワークスペースに名前を付けると、正常に機能し、単一のワークスペースが返されますが、ドキュメントには、すべてのワークスペースに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)
    }
}

プロジェクトコレクションの管理者権限で実行しています。

4

2 に答える 2

2

問題は、.netクラスが文字列を予期しているときにPowerShellがnullをnullとして渡さないことであるように見えます。PowerShellレイヤーのどこかで、nullが空の文字列に変換されました。これにより、すべてのワークスペースを返すコードパスが実行されなくなりました。代わりに、「」というワークスペースを一致させようとしていました。

この問題の詳細は、PowerShell3.0で修正される問題を報告して いるMicrosoftConnectの記事に記載されています。

問題が何であるかを知り、それを修正する方法のヒントを使って、私はReflectionルートから始めました。ただし、QueryWorkspacesメソッドがオーバーロードされているため、これはさらに複雑になり、GetTypeを呼び出すだけで例外がスローされました。PowerShellがTypeの配列ではなくObjectの配列として渡したため、Typeの配列をGetType呼び出しに渡そうとして失敗しました。したがって、それは長い手で行われなければなりませんでした...

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)
        }
    }
}
于 2012-12-04T11:27:28.970 に答える
0

パスインを使用し$nullたことがあります

[System.Management.Automation.Language.NullString]::Value

それ以外の$null

(PowerShellはこれを適切に処理せず、次のよう$nullに解釈されます""

于 2017-10-19T19:15:30.430 に答える