【问题标题】:Display multiple array values in list in Powershell在 Powershell 的列表中显示多个数组值
【发布时间】:2021-07-23 06:04:13
【问题描述】:

我有多个这样的数组:

$arrayList1 = @()
$arrayList2 = @()

$arrayList1 += "james"
$arrayList1 += "henry"
$arrayList1 += "bob"

$arrayList2 += "scott"
$arrayList2 += "john"
$arrayList2 += "meera"
$arrayList2 += "lisa"
$arrayList2 += "joseph"

我想像这样显示输出:

arrayList1 arrayList2
james scott
henry john
bob meera
lisa
joseph

这是我尝试过的:

$output = @{}
$output.add('arrayList1',$arrayList)
$output.add('arrayList2',$arrayLis2)
[PSCustomObject]$output

$output

输出如下:

arrayList2 arrayList1
{scott,john,meera,lisa,joseph} {james,henry,bob}

注意:数组不会有相同数量的数据。

有什么建议可以按我想要的顺序得到吗?

谢谢

桑吉夫

【问题讨论】:

  • $arrayList1 |FullJoin $arrayList2 或使用其中一种自己动手的解决方案并遍历两个数组,直到它们为空。
  • @iRon 这就像魅力一样,直到其中一个 arrayList 没有任何价值。在这种情况下,它似乎无法在右标题下正确显示数据。例如有 2 个有数据的 arrayList,有第 3 个没有数据的,现在使用 FullJoin,它会删除第一个 arrayList 标头,只显示其余两个。
  • 问题是explained and fixed 使用:$arrayList1 |FullJoin [object[]]$arrayList2

标签: arrays powershell


【解决方案1】:

一个简洁的解决方案(注意:假设至少有一个数组是非空的):

$arrayList1 = 'james', 'henry', 'bob'
$arrayList2 = 'scott', 'john', 'meera', 'lisa', 'joseph'

foreach ($i in 0..([Math]::Max($arrayList1.Count, $arrayList2.Count)-1)) {
  [pscustomobject] @{ arrayList1 = $arrayList1[$i]; arrayList2 = $arrayList2[$i] }
}

根据需要,上述结果如下:

arrayList1 arrayList2
---------- ----------
james      scott
henry      john
bob        meera
           lisa
           joseph

【讨论】:

  • 我想我从现在开始使用[math]::Max( ) 而不是Measure-Object -Maximum
  • 有道理,@SantiagoSquarzon。出于性能原因,通常最好避免在表达式中使用管道/cmdlet。
  • @mklement0 你知道是否有办法对每个 arrayList 的输出进行排序?
  • 很高兴听到这个消息; @sanjeev,使用Sort-Object;例如$arrayList2 = 'scott', 'john', 'meera', 'lisa', 'joseph' | Sort-Object 或事后$arrayList2 = $arrayList2 | Sort-Object
【解决方案2】:

试试这样的:

$Boys = "Bob", "Noah", "Liam"
$Girls = "Olivia", "Sophia", "Charlotte", "Emma"

Function Fix-Arrays {
    Param(
        [Parameter(Mandatory=$True)]
        [string[]]$ArrayNames,
        [switch]$NoWarnings = $False
    )
    $ValidArrays,$ItemCounts = @(),@()
    $VariableLookup = @{}
    
    ForEach ($Array in $ArrayNames) {
        Try {
            $VariableData = Get-Variable -Name $Array -ErrorAction Stop
            $VariableLookup[$Array] = $VariableData.Value
            $ValidArrays += $Array
            $ItemCounts += ($VariableData.Value | Measure).Count
        }

        Catch {
            If (!$NoWarnings) {Write-Warning -Message "No variable found for [$Array]"}
        }
    }

    $MaxItemCount = ($ItemCounts | Measure -Maximum).Maximum
    $FinalArray = @()
    
    For ($Inc = 0; $Inc -lt $MaxItemCount; $Inc++) {
        $FinalObj = New-Object PsObject
        ForEach ($Item in $ValidArrays) {
            $FinalObj | Add-Member -MemberType NoteProperty -Name $Item -Value $VariableLookup[$Item][$Inc]
        }

        $FinalArray += $FinalObj
    }

    $FinalArray
}

Fix-Arrays -ArrayNames "Boys","Girls"

只需编辑 Fix-Arrays(第 41 行)和前两个示例数组以满足您的需要。

【讨论】:

  • 更新问题以显示我更新数组列表的实际方式。我试过这个功能,看起来它不起作用。
  • @sanjeev 这很奇怪,我使用了你的修改,它对我有用。 this你是怎么格式化的? Edit:我更新了 cmets 以更好地说明我所做的更改
  • 我想我知道我做错了什么。我有这样的 Fix-Arrays -ArrayNames $arrayList1, $arrayList2 当它应该是 Fix-Arrays -ArrayNames "arrayList1", "arrayList2"。您的解决方案按预期工作。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2021-09-26
  • 1970-01-01
  • 2015-07-28
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多