当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于数组

作者:精品下载站 日期:2024-12-14 02:24:54 浏览:13 分类:玩电脑

关于数组


简短描述

描述数组,数组是设计用于存储项目集合的数据结构。

详细描述

数组是一种数据结构,旨在存储项目的集合。这些项目可以是相同类型或不同类型。

从 Windows PowerShell 3.0 开始,零个或一个对象的集合具有数组的一些属性。

创建并初始化数组

要创建并初始化数组,请将多个值分配给一个变量。存储在数组中的值以逗号分隔,并通过赋值运算符 (=) 与变量名称分隔。

例如,要创建一个名为 $A 的数组,其中包含 22、5、10、8、12、9 和 80 七个数字(整数)值,请键入:

$A = 22,5,10,8,12,9,80

通过将逗号放在单个项目之前,逗号还可以用于初始化单个项目数组。

例如,要创建包含单个值 7 的名为 $B 的单个项目数组,请键入:

$B = ,7

您还可以使用范围运算符 (..) 创建和初始化数组。以下示例创建一个包含值 5 到 8 的数组。

$C = 5..8

因此,$C 包含四个值:5、6、7 和 8。

如果未指定数据类型,PowerShell 将每个数组创建为对象数组 (System.Object[])。要确定数组的数据类型,请使用 GetType() 方法。例如:

$A.GetType()

要创建强类型数组,即只能包含特定类型值的数组,请将变量强制转换为数组类型,例如 string[]long[] 。有关布尔计算的更多信息,请参阅 about_Booleans。

Where() 方法有一个定义。

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

笔记

该语法需要使用脚本块。如果脚本块是唯一的参数,则括号是可选的。此外,方法和左括号或大括号之间不能有空格。

Expression 是过滤所需的脚本块,mode 可选参数允许额外的选择功能,numberToReturn 可选参数允许限制从过滤器返回了多少个项目。

mode 的值必须是WhereOperatorSelectionMode 枚举值:

  • 默认 (0) - 返回所有项目
  • First (1) - 返回第一项
  • Last (2) - 返回最后一项
  • SkipUntil (3) - 跳过项目直到条件为 true,返回所有剩余项目(包括条件为 true 的第一个项目)
  • Until (4) - 返回所有项目,直到条件为 true
  • Split (5) - 返回两个元素的数组

    • 第一个元素包含匹配项
  • 第二个元素包含剩余的项目

以下示例显示如何从数组中选择所有奇数。

(0..9).Where{ $_ % 2 }
1
3
5
7
9

下一个示例显示如何选择所有非空字符串。

('hi', '', 'there').Where{ $_ }
hi
there

默认

Default 模式使用 Expression 脚本块过滤项目。

如果提供了 numberToReturn,则它指定要返回的最大项目数。

# Get the zip files in the current users profile, sorted by LastAccessTime
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

笔记

Default 模式和 First 模式均返回第一个 (numberToReturn) 项,并且可以互换使用。

最后的

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil

SkipUntil 模式会跳过集合中的所有对象,直到对象通过脚本块表达式过滤器。然后,它返回所有剩余的集合项目,而不对其进行测试。 仅测试一项通过的项目

这意味着返回的集合包含未通过测试的通过未通过项目。

可以通过将值传递给 numberToReturn 参数来限制返回的项目数。

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

直到

Until 模式反转 SkipUntil 模式。它返回集合中的ALL 项,直到某个项通过脚本块表达式。一旦项目通过脚本块表达式,Where() 方法就会停止处理项目。

这意味着您从 Where() 方法接收第一组非传递项目。 一项通过后,其余的不会被测试或退回。

可以通过将值传递给 numberToReturn 参数来限制返回的项目数。

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

笔记

UntilSkipUntil都是在不测试一批项目的前提下运行的。

Until 返回第一个BEFORE 的项目PASSSkipUntil 返回第一个之后第一个传递的所有项目,包括第一个传递的项目。

分裂

Split 模式将集合项拆分或分组为两个单独的集合。那些通过脚本块表达式的,以及那些不通过的。

如果指定了 numberToReturn,则第一个集合包含传递 项,但不超过指定的值。

其余对象,甚至是那些通过表达式过滤器的对象,都会在第二个集合中返回。

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

笔记

ForEach()Where() 方法都是内部成员。有关内部成员的更多信息,请参阅 about_Instrinsic_Members。

获取数组的成员

要获取数组的属性和方法,例如 Length 属性和 SetValue 方法,请使用 InputObject 参数Get-Member cmdlet。

当您通过管道将数组传递给 Get-Member 时,PowerShell 一次发送一项,而 Get-Member 返回数组中每一项的类型(忽略重复项)。

当您使用 InputObject 参数时,Get-Member 返回数组的成员。

例如,以下命令获取 $a 数组变量的成员。

Get-Member -InputObject $a

您还可以通过在通过管道传输到 Get-Member cmdlet 的值之前键入逗号 (,) 来获取数组的成员。逗号使数组成为数组数组中的第二项。 PowerShell 一次通过管道传输一个数组,Get-Member 返回数组的成员。就像接下来的两个例子一样。

,$a | Get-Member

,(1,2,3) | Get-Member

操作数组

您可以更改数组中的元素、向数组中添加元素,以及将两个数组中的值合并到第三个数组中。

要更改数组中特定元素的值,请指定数组名称和要更改的元素的索引,然后使用赋值运算符 (=) 指定新值元素。例如,要将 $a 数组中第二项的值(索引位置 1)更改为 10,请键入:

$a[1] = 10

您还可以使用数组的 SetValue 方法来更改值。以下示例将 $a 数组的第二个值(索引位置 1)更改为 500:

$a.SetValue(500,1)

您可以使用 += 运算符将元素添加到数组中。以下示例演示如何向 $a 数组添加元素。

$a = @(0..4)
$a += 5

笔记

当您使用 += 运算符时,PowerShell 实际上会使用原始数组的值和添加的值创建一个新数组。如果操作重复多次或数组大小太大,这可能会导致性能问题。

从数组中删除元素并不容易,但您可以创建一个仅包含现有数组中选定元素的新数组。例如,要使用 $a 数组中的所有元素(索引位置 2 处的值除外)创建 $t 数组,请键入:

$t = $a[0,1 + 3..($a.length - 1)]

要将两个数组合并为一个数组,请使用加号运算符 (+)。以下示例创建两个数组,将它们组合起来,然后显示组合后的数组。

$x = 1,3
$y = 5,9
$z = $x + $y

因此,$z 数组包含 1、3、5 和 9。

要删除数组,请将值 $null 分配给该数组。以下命令删除 $a 变量中的数组。

$a = $null

您还可以使用 Remove-Item cmdlet,但分配 $null 值会更快,尤其是对于大型数组。

零或一的数组

从 Windows PowerShell 3.0 开始,零个或一个对象的集合具有 CountLength 属性。此外,您还可以对一个对象的数组进行索引。此功能可帮助您避免在需要集合的命令获取的项目少于两个时发生的脚本错误。

以下示例显示不包含对象的变量的 CountLength 均为 0。

PS> $a = $null
PS> $a.Count
0
PS> $a.Length
0

以下示例显示包含一个对象的变量的 CountLength 均为 1。您还可以使用数组索引来访问该对象的值。

PS> $a = 4
PS> $a.Count
1
PS> $a.Length
1
PS> $a[0]
4
PS> $a[-1]
4

当您运行可返回集合或单个对象的命令时,您可以使用数组索引来访问对象的值,而无需测试 CountLength 属性。但是,如果结果是单个对象(单例),并且该对象具有 CountLength 属性,则这些属性的值属于单例对象,并且不适用t 表示集合中的项目数。

在以下示例中,该命令返回单个字符串对象。该字符串的长度4

PS> $result = 'one','two','three','four' | Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String
PS> $result
four
PS> $result.Count
1
PS❯ $result.Length
4

如果您希望 $result 为字符串数组,则需要将变量声明为数组。

在此示例中,$result 是一个字符串数组。数组的计数长度1,第一个元素的长度4

PS> [string[]]$result = 'one','two','three','four' |
    Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String[]
PS> $result
four
PS> $result.Count
1
PS> $result.Length
1
PS> $result[0].Length
4

System.Tuple 对象的索引支持

PowerShell 6.1 添加了对 Tuple 对象的索引访问的支持,类似于数组。例如:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

与数组和其他集合对象不同,元组对象在通过管道或支持对象数组的参数传递时被视为单个对象。

有关详细信息,请参阅 System.Tuple。

索引实现 IDictionary TKey、TValue 的 .NET 类型

PowerShell 不会为实现通用 IDictionary

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯