Arrays 将对象数组转换为哈希表时出错

Arrays 将对象数组转换为哈希表时出错,arrays,powershell,hash,vmware,powercli,Arrays,Powershell,Hash,Vmware,Powercli,快速概述:脚本有两个函数,一个获取两个角色列表并将它们放入哈希表中,然后返回该哈希表。然后,流程角色接受一个哈希表,并对其进行一些比较 $RoleTable应该是一个哈希表,但我认为在我的Get Roles函数之后,Powershell将$RoleTable作为一个对象数组。然后我得到一个转换错误: Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Collections.H

快速概述:脚本有两个函数,一个获取两个角色列表并将它们放入哈希表中,然后返回该哈希表。然后,流程角色接受一个哈希表,并对其进行一些比较

$RoleTable应该是一个哈希表,但我认为在我的Get Roles函数之后,Powershell将$RoleTable作为一个对象数组。然后我得到一个转换错误:

Cannot convert the "System.Object[]" value of type "System.Object[]" to type 
"System.Collections.Hashtable".
这是我剧本的主要部分

$creds = Get-Credential
$MasterServer = Read-Host "`n Master Server"
$SlaveServer  = Read-Host "`n Slave Server"

$RoleTable = Get-Roles -MasterServer $MasterServer -SlaveServer $SlaveServer -Credential $creds

Process-Roles -RoleTable $RoleTable
下面是我在其中创建哈希表的函数,并将其传递给$RoleTable

function Get-Roles {
    Param(
        [Parameter(Mandatory=$True,Position=0)]
        [string]$MasterServer,

        [Parameter(Mandatory=$True,Position=1)]
        [string]$SlaveServer,

        [Parameter(Mandatory=$True,Position=2)]
        [pscredential]$Credential
    )

    $DiscoveredRoles = @{}

    # Get Master Roles
    Connect-VIServer $MasterServer -Credential $Credential | out-null
    $DiscoveredRoles["MasterRoles"] = Get-VIRole
    Disconnect-VIServer $MasterServer -Confirm:$false

    #Get Slave Roles
    Connect-VIServer $SlaveServer -Credential $Credential | out-null
    $DiscoveredRoles["SlaveRoles"] = Get-VIrole
    Disconnect-VIServer $SlaveServer -Confirm:$false

    Write-Verbose "`n + Retrieved Roles Successfully"

    return $DiscoveredRoles

}    
这里是错误发生的地方。进程角色需要哈希表,但我相信powershell将$RoleTable转换为数组?(这至少是我的谷歌富告诉我的)


当返回多个值时,PowerShell函数将返回一个数组。函数中返回未被忽略且未分配给变量的值的每个语句都会对返回值作出贡献

我看到它返回了一些东西。因此,
Get Roles
将返回多个值:包括对
Connect-VIServer
的两个调用中的两个值

如果您不希望这些其他语句中的值,则需要显式地除去它们。例如,通过管道输入
输出null

(谢谢你):


正如@Richard所指出的,如果您不想看到cmdlet的输出被写入管道,那么需要抑制cmdlet的输出

除了通过管道输送到
输出Null
,还有其他抑制输出的方法:

显式强制转换为
无效

[void](Connect-VIServer $SlaveServer -Credential $Credential)
(Connect-VIServer $SlaveServer -Credential $Credential) -as [void]
未选中的强制转换为无效:

[void](Connect-VIServer $SlaveServer -Credential $Credential)
(Connect-VIServer $SlaveServer -Credential $Credential) -as [void]
分配给
$null

$null = Connect-VIServer $SlaveServer -Credential $Credential
Connect-VIServer $SlaveServer -Credential $Credential > $null
重定向到
$null

$null = Connect-VIServer $SlaveServer -Credential $Credential
Connect-VIServer $SlaveServer -Credential $Credential > $null

Connect VIServer$SlaveServer-Credential$Credential | Out Null
谢谢!我爱你。现在100%有效