Azure Profile.Model被拼接到powershell

时间:2018-02-16 14:54:15

标签: powershell azure

我似乎无法在网上找到任何可以解释为什么Azure Profile.Model会被添加到我试图使用powershell azurerm资源命令检索的sql服务器数组的原因。在调试时单步调试以下代码表明,从我的函数返回的sql服务器数组只显示我指定的资源组中的4个元素,所有这些元素都是使用以下命令检索的sql服务器。

$sqlServers = Get-AzureRmResource -ResourceGroupName `
  $resourceGroup.ResourceGroupName -ResourceType Microsoft.Sql/servers `
  -IsCollection -ApiVersion 2015-05-01-preview

上面的代码位于一个函数中,用于检索给定资源组的服务器。在函数的底部,我只是return $allServers

Function GetSharedServers {
    Param (
        [string]$subscriptionId
    )

    if($subscriptionId -eq "") {
        return @()
    }

    Set-AzureRmContext -SubscriptionId $subscriptionId
    $resourceGroups = Get-AzureRmResourceGroup

    $allServers = @()
    foreach($resourceGroup in $resourceGroups) {
        $sqlServers = Get-AzureRmResource -ResourceGroupName $resourceGroup.ResourceGroupName -ResourceType Microsoft.Sql/servers `
            -IsCollection -ApiVersion 2015-05-01-preview
        if ($sqlServers.count -gt 0) {
            $allServers += $sqlServers
        }
    }
    return $allServers
}

调用此函数的代码

$sqlServers = GetSharedServers $subscriptionId

在Debug上的GetSharedServers中,$ allServers数组只包含4个元素,所有元素都是SQL Server实例。一旦我进入调用该函数的代码,就会添加Profile.Model。所以上面,$ allServers是Sql服务器,$ sqlServers现在有一个Profile.Model拼接到0元素。下面的函数只是遍历从GetSharedServers返回的$ sqlServers数组,这是我必须从1开始的地方。

Function SelectSharedInstance {
    Param (
        [array]$sqlServers,
        [string]$env
    )

    # Starting at 1 since for some reason azure account is passed as 0?
    for($i = 1; $i -le $sqlServers.length -1; $i++) {
        Write-Host $i ")" $sqlServers[$i].Name "`r"
    }
    $selectedServer = Read-Host -Prompt "Please select a $env shared sql server instance"
    return $selectedServer
}

正如我上面所说,在vscode中逐步调试该函数显示返回的数组仅包含资源组上的4个服务器。但是在下一个调试步骤中,当我返回调用该函数的脚本时,奇怪的是数组现在有一个新的[0]元素,类型为Microsoft.Azure.Commands.Profile.Model

这意味着现在只列出返回的$allServers我必须从[1]元素开始,因为数组已被配置文件元素破坏。这不是一个大问题,只是不是理想的结果。

我现在的问题是,是否有人知道为什么Microsoft.Azure.Commands.Profile.Model会被使用azure powershell恶意拼接到我的阵列中?我已经尝试删除-AngenRmContext -DefaultProfile,然后返回数组,看看我是否可以取消设置我的上下文,并希望不将它添加到数组,这没有帮助。我在这里不知所措,为什么只会添加到我的数组中。

1 个答案:

答案 0 :(得分:1)

您必须将Set-AzureRmContext的结果传递给null或将其分配给变量。否则,返回值将被放入管道并由GetSharedServers函数返回:

Set-AzureRmContext -SubscriptionId $subscriptionId | Out-Null

请注意,在PowerShell中,您不需要使用return关键字从函数返回内容,它仅用于退出函数。