【问题标题】:Powershell: Create multiple PSCustomObjects from 3 arrays with different lengthPowershell:从 3 个不同长度的数组创建多个 PSCustomObjects
【发布时间】:2022-01-15 22:11:08
【问题描述】:

这是一个初学者的问题,但经过几个小时的尝试,我仍然不知道,有什么比创建 3 个不同的 forloop 或一个带有 if-decisions 更好的:

示例代码:

$a = 1,2,3
$b = 5,6,7,8,9
$c = 4, 10

$test = [PSCustomObject]@{
    A = $a
    B = $b
    C = $c
}

$test

我得到输出:

A         B               C      
-         -               -      
{1, 2, 3} {5, 6, 7, 8...} {4, 10}

我尝试使用这个简单的示例,最好导出一个 csv 文件,每个列都有一个标题(如上),但值不在一行中。所以我得到了一个包含所有 1000 多个值的标题表在真正的问题中。每列的额外文件似乎也不是最好的解决方案..

我正在寻找一个版本来获得类似的输出(但对于所有数据):

A,B,C
1,5,4
2,6,10
3,7,
,8,
...

当我遍历输入并为每一行创建一个 PSCustomObject 时,我可以得到这个,但是当我想到不同的长度时,我想到了 3 个循环。一个带有一些额外代码的循环以避免索引错误。 总有一些事情告诉我,这是一项简单的任务,但我找不到优雅的解决方案。

我很欣赏每一个想法!

谢谢

【问题讨论】:

  • for 循环绝对适用于此,您只需要一个而不是三个。但是foreachwhiledo 也可以,这取决于你更喜欢哪一个。您正在尝试做的事情称为 join arraysmerge arrays

标签: arrays powershell pscustomobject


【解决方案1】:

这是使用while 循环和Measure-Object 来获得3 arrays 上的最大元素数的一种方法:

$a = 1,2,3
$b = 5,6,7,8,9
$c = 4,10

$max = $a.Count, $b.Count, $c.Count | Measure-Object -Maximum
$i = 0

$result = while($max.Maximum--)
{
    [pscustomobject]@{
        A = $a[$i]
        B = $b[$i]
        C = $c[$i]
    }
    $i++
}

现在查看您的预期输出,似乎您想将数据导出到 CSV,在这种情况下,您可以使用 Export-Csv,如果您只想转换数据但不导出它,您可以使用 @987654324 @:

PS /> $result | ConvertTo-Csv -NoTypeInformation

"A","B","C"
"1","5","4"
"2","6","10"
"3","7",
,"8",
,"9",

【讨论】:

  • 非常感谢!很酷,今天我几乎疯了,自己想办法。我没有尝试任何类似的东西,因为我以前不知道,在 Powershell 中访问数组时返回 $null,当超出索引时。就像在其他编程语言中一样。好的,再次感谢您!非常好!!!!
  • @AndyW。好吧,如果你使用StrictMode,它会抛出一个超出范围的异常,但默认情况下它是关闭的。如果可以解决您的问题,请考虑accepting 的答案。
  • @AndyW。谢谢,请注意,使用StrictMode 代码会更复杂,但它在调试代码时很有帮助,但这是个人喜好问题。我个人从来不需要打开它。
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2020-05-30
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多