gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:15:03 24 4
gpt4 key购买 nike

快速概述:脚本具有两个功能,一个获得两个角色列表,并将它们放入哈希表,然后返回该哈希表。然后,Process-Roles接受哈希表,并对其进行一些比较。

$ 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

}

这是发生错误的地方。 Process-Roles需要一个哈希表,但是我相信Powershell将$ RoleTable转换为数组吗? (至少这是我的Google Fu告诉我的)
function Process-Roles { 
param(
[Parameter(Mandatory=$true)]
[ValidateScript({ $_.ContainsKey("MasterRoles") -and $_.ContainsKey("SlaveRoles") })]
[hashtable]$RoleTable
)

$MasterRoleNames = $RoleTable["MasterRoles"] |Select-Object -ExpandProperty Name

$SlaveRoleNames = $RoleTable["SlaveRoles"] |Select-Object -ExpandProperty Name

$MasterRoleNames |Where-Object { $SlaveRoleNames -notcontains $_ } |ForEach-Object {
Write-Verbose "$_ doesn't exist on slave"
}

$SlaveRoleNames |Where-Object { $MasterRoleNames -notcontains $_ } |ForEach-Object {
Write-Verbose "$_ doesn't exist on Master"
}

Write-Verbose "`n + Processed Roles Successfully"
}

最佳答案

当返回多个值时,PowerShell函数将返回一个数组。函数中返回不被忽略且未分配给变量的值的每个语句都将构成返回值。

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

如果您不希望这些其他语句中的值,则需要显式摆脱它们。例如。通过管道到out-null中。

例如。 (感谢@MathiasRJessen):

Connect-VIServer $SlaveServer -Credential $Credential | Out-Null

关于arrays - 将对象数组转换为哈希表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31812946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com