Powershell多维数组

Kar*_*son 37 powershell

我有一种在其他语言中做数组的方法:

$x = "David"
$arr = @()

$arr[$x]["TSHIRTS"]["SIZE"] = "M"
Run Code Online (Sandbox Code Playgroud)

这会产生错误.

man*_*lds 52

您正在尝试创建关联数组(哈希).尝试以下命令序列

$arr=@{}
$arr["david"] = @{}
$arr["david"]["TSHIRTS"] = @{}    
$arr["david"]["TSHIRTS"]["SIZE"] ="M"
$arr.david.tshirts.size
Run Code Online (Sandbox Code Playgroud)

注意哈希和数组之间的区别

$a = @{} # hash
$a = @() # array
Run Code Online (Sandbox Code Playgroud)

数组只能将非负整数作为索引

  • 请注意,负索引在 Powershell 中是有意义的。`$arr[-1]` 是数组中的最后一项,`$arr[-2]` 是倒数第二项,依此类推。 (2认同)

CB.*_*CB. 28

来自powershell.com:

PowerShell支持两种类型的多维数组:锯齿状数组和真正的多维数组.

Jagged数组是普通的PowerShell数组,它将数组存储为元素.这是非常经济的存储,因为尺寸可以是不同的尺寸:

$array1 = 1,2,(1,2,3),3
$array1[0]
$array1[1]
$array1[2]
$array1[2][0]
$array1[2][1]
Run Code Online (Sandbox Code Playgroud)

真正的多维数组总是类似于方形矩阵.要创建这样的数组,您需要访问.NET.下一行创建一个二维数组,其中10和20个元素类似于10x20矩阵:

$array2 = New-Object 'object[,]' 10,20
$array2[4,8] = 'Hello'
$array2[9,16] = 'Test'
$array2
Run Code Online (Sandbox Code Playgroud)

对于3维数组10*20*10

$array3 = New-Object 'object[,,]' 10,20,10
Run Code Online (Sandbox Code Playgroud)

  • 您不一定要访问.NET:[PS] C:\> $ array = @(,@(,@(,@())))[PS] C:\> $ array [0] [0 ] [0] = 1 (4认同)
  • 在 PS Core 7.x 中,您可以使用更简洁的语法:`$array = [object[,]]::new(10, 20)` (3认同)
  • 无论如何,它们并不完全相同。一个必须引用为 $array[n,n],另一个引用为 $array[n][n]。 (2认同)
  • 对于任何想要使用多维数组的人,您可以使用 [`GetLength`](https://learn.microsoft.com/en-us/dotnet/api/system.array.getlength?view=net-5.0) 方法获取特定维度的元素数量。例如,对于“$array2 = New-Object 'object[,]' 10,20”,“$array2.GetLength(0)”将返回 10,“$array2.GetLength(1)”将返回 20。 (2认同)
  • @DaveF 和 `$array2.GetUpperBound(n)` 来查找索引号的长度,这是循环数组时所需要的。它相当于“$array.GetLength(n) - 1”。顺便说一句,此方法也可以用于普通 PS 数组,只需为 n 输入 0,因为它是一维的。 (2认同)

小智 15

为了扩展内容,manojlds,上面说的是你可以嵌套Hashtables.它可能不是一个真正的多维数组,但会为您提供有关如何构建数据的一些想法.一个例子:

$hash = @{}

$computers | %{
    $hash.Add(($_.Name),(@{
        "Status" = ($_.Status)
        "Date"   = ($_.Date)
    }))
}
Run Code Online (Sandbox Code Playgroud)

这有什么好处,你可以参考如下:

($hash."Name1").Status
Run Code Online (Sandbox Code Playgroud)

此外,它比数组的查找速度要快得多.我使用它来比较数据而不是在数组中使用匹配.

$hash.ContainsKey("Name1")
Run Code Online (Sandbox Code Playgroud)

希望其中一些有帮助!

-亚当


Xav*_*ohn 8

这是一个简单的多维字符串数组。

$psarray = @(
 ('Line' ,'One' ),
 ('Line' ,'Two')
)

foreach($item in $psarray)
{
    $item[0]
    $item[1]
}
Run Code Online (Sandbox Code Playgroud)

输出:

Line
One
Line
Two
Run Code Online (Sandbox Code Playgroud)


iRo*_*Ron 7

知道PowerShell管理cmdlet之间的对象,使用PSCustomObjects数组更为常见:

$arr = @(
    New-Object PSObject -Property @{Name = "David";  Article = "TShirt"; Size = "M"}
    New-Object PSObject -Property @{Name = "Eduard"; Article = "Trouwsers"; Size = "S"}
)
Run Code Online (Sandbox Code Playgroud)

或者对于PowerShell版本3及更高版本:

$arr = @(
    [PSCustomObject]@{Name = "David";  Article = "TShirt"; Size = "M"}
    [PSCustomObject]@{Name = "Eduard"; Article = "Trouwsers"; Size = "S"}
)
Run Code Online (Sandbox Code Playgroud)

并选择以下内容:

$arr | Where {$_.Name -eq "David" -and $_.Article -eq "TShirt"} | Select Size
Run Code Online (Sandbox Code Playgroud)


小智 5

另一个线程在这里指出了如何在 Powershell 中添加到多维数组。我不知道是否有某种原因不使用这种方法,但它对我的目的有效。

$array = @()
$array += ,@( "1", "test1","a" )
$array += ,@( "2", "test2", "b" )
$array += ,@( "3", "test3", "c" )
Run Code Online (Sandbox Code Playgroud)