我遇到此代码的问题,如果数组中的项目返回少于两个字符串,则该字符串显示为列表。
例如,如果我有两个群集。列表框为我提供了选择Test-Cluster和Dev-Cluster的选项;但是,如果只有Test-Cluster是唯一可用的群集,则列表框会将字符串的每个字母显示为列表框中的不同选项。我似乎不知道为什么。查看图片:
#event: when Environment is selected
$wpFBoxEnvironment.Add_DropDownClosed({
Disconnect-VIServer * -Confirm:$false
#empty VCenters inside form
$wpFBoxSrcVCenter.Items.Clear()
$wpFListTgtVCenters.Items.Clear()
#empty Source VMs inside form
$wpFListSrcVMs.Items.Clear()
#validate VI servers connetion and connect if session doesn't exist
$VServers = $vdiEnvironments |
Where-Object Env -like $wpFBoxEnvironment.Text
#notify use to wait for vCenter server login
Write-Host "Logging in to all $($wpFBoxEnvironment.Text) servers. Please wait..."
foreach ($VServer in $VServers) {
$sessionID = ($global:DefaultVIServers | Where-Object -FilterScript {$_.Name -like $VServer.Name}).sessionId
if ($sessionID) {
Connect-VIServer -Server $VServer.Name -Session $sessionID
} elseif ($credential) {
Connect-VIServer -Server $VServer.Name -Credential $credential
} else {
throw 'Connection Error'
}
}
$clusters = Get-Cluster | Select-Object Name, Uid
$clusters | ForEach-Object {
$_ | Add-Member -MemberType NoteProperty -Name VCName -Value $_.Uid.Split('@')[1].Split(':')[0]
}
$datastores = Get-Datastore | Select-Object -Property Name, DatastoreBrowserPath, FreeSpaceMB, CapacityMB
$datastores | ForEach-Object {
$_ | Add-Member -MemberType NoteProperty -Name VCName -Value $_.DatastoreBrowserPath.Split('\')[1].replace('@443','')
$_.FreeSpaceMB = [int]$_.FreeSpaceMB
$_.CapacityMB = [int]$_.CapacityMB
}
$portgroups = Get-VDPortgroup | Select-Object VlanConfiguration, Name, NumPorts, Uid | ? VlanConfiguration -notlike "*0-4094*"
$portgroups | ForEach-Object {
$_ | Add-Member -MemberType NoteProperty -Name VCName -Value $_.Uid.Split('@')[1].Split(':')[0]
$_.NumPorts = [int]$_.NumPorts
}
$vCenters = @()
foreach ($vCenter in $VDIEnvironments) {
#Find single clusters and padd array
if (($clusters | ? VCName -like $vCenter.Name).Count -eq 1) {
$clusters += ("-----")
}
$vCenter |
Add-Member -MemberType NoteProperty -Name TargetCluster -Value (
$clusters | ? VCName -like $vCenter.Name
)[0].Name -Force
$vCenter |
Add-Member -MemberType NoteProperty -Name Clusters -Value $(
$clusters | ? VCName -like $vCenter.Name
).Name -Force
$vCenter |
Add-Member -MemberType NoteProperty -Name TargetDatastore -Value $(
$datastores | ? VCName -like $vCenter.Name | Sort-Object -Descending FreeSpaceMB
)[0].Name -Force
$vCenter |
Add-Member -MemberType NoteProperty -Name Datastores -Value $(
$datastores | ? VCName -like $vCenter.Name
).Name -Force
$vCenter |
Add-Member -MemberType NoteProperty -Name TargetPortgroup -Value (
$portgroups | ? VCName -like $vCenter.Name | Sort-Object -Descending NumPorts
)[0].Name -Force
$vCenter |
Add-Member -MemberType NoteProperty -Name Portgroups -Value $(
$portgroups | ? VCName -like $vCenter.Name
).Name -Force
$vCenters += $vCenter
}
#fill VCenters inside form from selected Environment
$selectedVCenters = $vCenters |
Where-Object Env -like $wpFBoxEnvironment.Text |
Where-Object Datastores -ne $Null
$selectedVCenters | ForEach-Object {
$wpFBoxSrcVCenter.Items.Add($_.Name)
$wpFListTgtVCenters.Items.Add($_)
$wpFListTgtVCenters.SelectedItems.Add($_)
}
})
<GridViewColumn Header="Target Cluster"
Width="160" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding 'Clusters'}"
SelectedItem="{Binding Path='TargetCluster', Mode=TwoWay}"
Width="145"
/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
答案 0 :(得分:0)
我认为这是因为您正在遍历数组,或者在单个项目的情况下遍历字符串。尝试预定义数组,然后向其添加(+=
)。这样,在单个字符串的情况下,它仍将是一个数组:
编辑:
查看数据,看起来您可能需要通过将$_
包裹在@(..)
中来将单个字符串显式转换为数组,以获得:@($_)
这将把字符串转换成单个值数组,或者保留现有的数组。更多信息:about_arrays
...
#fill VCenters inside form from selected Environment
$selectedVCenters = @()
$selectedVCenters += $vCenters |
Where-Object Env -like $wpFBoxEnvironment.Text |
Where-Object Datastores -ne $Null
$selectedVCenters | ForEach-object {
$wpFBoxSrcVCenter.Items.Add($_.Name)
$wpFListTgtVCenters.Items.Add(@($_))
$wpFListTgtVCenters.SelectedItems.Add($_)
}