基本使用
$data = @() #创建空数组
$data[0] #输出空
$data.count #结果0
#大多数对象都有count属性。即使$null,$null.count=0
$data = @('Zero','One','Two','Three')
$data #输出数组所有值
$data.count #输出数组长度
#跨行定义数组
$data = @(
'Zero'
'One'
'Two'
'Three'
)
#直接定义
$data = 'Zero','One','Two','Three'
#访问元素
$data = 'Zero','One','Two','Three'
$data[0] #输出Zero
$data[0,2,3] #输出三个元素Zero Two Three
$data[3,0,3]#输出Three Zero Three
$data[1..3]#输出One Two Three
$data[1..3]#输出Three Two One
$data[-1]#输出Three。-1代表最后一个位置
$data[0..-1] #等价于$data[0,-1]
$data[-1..0] #等价于$data[-1,0]
$data[4] #结果为空
$data[ $data.count - 1 ] #等价于$data[-1]
$empty = $null#变量为空,不能用索引访问。注意和空数组对比。
$empty[0]#Error: Cannot index into a null array.
$includeEmpty=$null,'aa' #数组中可以用元素为空
$includeEmpty[0] #输出为空
$includeEmpty[1] #输出aa
#循环操作
#1.将数组通过管道传递给ForEach-Object
$data = 'Zero','One','Two','Three'
$data | ForEach-Object {"Item: [$PSItem]"} #$PSItme和$_代表当前元素。是元素的拷贝。
结果
Item: [Zero]
Item: [One]
Item: [Two]
Item: [Three]
#2.foreach循环中使用数组
$data = 'Zero','One','Two','Three'
foreach ( $node in $data )
{
"Item: [$node]" #$node是数组元素的拷贝
}
#3.for循环中使用数组
for ( $index = 0; $index -lt $data.count; $index++)
{
"Item: [{0}]" -f $data[$index]
}
#4.switch循环
$data = 'Zero','One','Two','Three'
switch( $data )
{
'One'
{
'Tock'
}
'Three'
{
'Tock'
}
Default
{
'Tick'
}
}
#!!!!更新数组的值用for循环
for ( $index = 0; $index -lt $data.count; $index++ )
{
$data[$index] = "dd" #会将数组的值全设置为dd。
}
对象数组
数组中除了存放值,也可以存放对象。
$processList = Get-Process #许多cmdlet返回一组对象。可以直接存放再数组中
#如下标引用,长度计数这些基本性质都可以在上面的数组中
$data = @(
[pscustomobject]@{FirstName='Kevin';LastName='Marquette'}
[pscustomobject]@{FirstName='John'; LastName='Doe'}
)
$data #输出如下:这是自定义的对象
FirstName LastName
--------- --------
Kevin Marquette
John Doe
$data[0] #访问对象元素,输出如下
FirstName LastName
--------- --------
Kevin Marquette
$data[0].FirstName #访问元素的属性,输出:Kevin
$data[0].FirstName = 'Jay' #更新对象的属性
#访问对象数组所有元素的属性
#1.用ForEarch-Object
$data | ForEach-Object {$_.LastName}
结果:
Marquette
Doe
#2.使用Select-Object -ExpandProperty
$data | Select-Object -ExpandProperty LastName #结果同上
#3.直接使用数组名,代表了所有元素
$data.LastName #结果同上
#Where-Object选择和过滤。where和?是它的别名
$data | Where-Object {$_.FirstName -eq 'Kevin'}
#用循环更新对象数组的属性
#元素为值类型,更新只能用for循环。但对象数组元素为引用类型。选择就多了
foreach($person in $data)
{
$person.FirstName = 'Kevin'
}
#但不能用上述方法更新整个对象。如下操作,对$data无效。
foreach($person in $data)
{
$person = [pscustomobject]@{
FirstName='K'
LastName='M'
}
}
操作符
- -join
用指定的字符或字符串连接数组元素。
$data = @(1,2,3,4)
$data -join '-' #输出1-2-3-4
$data -join 'aa'#输出1aa2aa3aa4
1 -join '-' #单个元素无影响,输出:1
"Data is $($data -join ',')." #输出 "Data is $($data -join ',')."
$data -join $null #合并数组元素(输出不换行)。结果:1234. 注意结果是字符串。
[int]($data -join $null)+1 #结果:1235,强制转换为数字类型
- -replace和-split
操作符作用于每个元素。
$data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')
$data -replace 'ATX','LAX'
LAX-SQL-01
LAX-SQL-02
LAX-SQL-03
- -contains
检查数组中是否含有某一特定值
$data = @('red','green','blue')
$data -contains 'green'#结果为True
- -in
类似-contain,不过数组应该放在右边
$data = @('red','green','blue')
'green' -in $data#结果True
'green' -match '^(red|green|blue)$' #支持正则表达式。结果:True
- -eq和-ne
对于等号(不等号),当数组在左边时,每个元素都会参与比较,返回相等(不相等)的元素。
$data = @('red','green','blue')
$data -eq 'green'#输出green
$data -ne 'green'#返回red blue
而在if语句中,上述相同的情况返回的是布尔值。
$data = @('red','green','blue')
if ( $data -eq 'green' )
{
'Green was found'
}
if ( $data -ne 'green' )
{
'And green was not found'
}
- -match
-match会匹配数组中的每个元素。它支持正则匹配。
$servers = @(
'LAX-SQL-01'
'LAX-API-01'
'ATX-SQL-01'
'ATX-API-01'
)
$servers -match 'SQL'#输出LAX-SQL-01,ATX-SQL-01
- $null和空
注意含有$null元素的数组和空数组。
数组判空:if($null -eq $arrayName) #$null要放在左边
另外:PSCustomObject对象只有powershell6.1才有Count属性。
建议判空方法:
if ( @($array).count -gt 0 )
{
"Array isn't empty"
}
向数组添加元素
不能向一个定长数组中添加元素。只能创建一个新数组,然后复制数组内容。使用 + 操作符,创建新的数组。
#实例1:
$first = @(
'Zero'
'One'
)
$second = @(
'Two'
'Three'
)
$first + $second
结果:
Zero
One
Two
Three
#实例2:
$data = @(
'Zero'
'One'
'Two'
'Three'
)
$data += 'four' # +=操作复杂原数组内容,创建新数组。等效于$a=$a+5
#数组名的加法,是向数组中添加元素。
#把管道的结果赋值给一个变量,生成数组
$array = 1..5 | ForEach-Object {
"ATX-SQL-$PSItem"
}
$array
结果:
ATX-SQL-1
ATX-SQL-2
ATX-SQL-3
ATX-SQL-4
ATX-SQL-5
$array = foreach ( $node in (1..5)) #把循环中的body存入数组。结果同上。
{
"ATX-SQL-$node"
}
数组类型
默认的,创建一个数组的类型为[PSObject[]]
类型,这运行数组包含任何类型的对象和值。这是有效的,因为所有类型都继承自[PSObject[]]
类型
- 强类型数组
只能存放指定类型的数据。
[int[]] $numbers = 1,2,3
[int[]] $numbers2 = 'one','two','three'
ERROR: Cannot convert value "one" to type "System.Int32". Input string was not in a correct format."
[string[]] $strings = 'one','two','three'
- ArrayList
可以增加元素的数组。
$myarray = [System.Collections.ArrayList]::new() #调用.net获取这种类型
[void]$myArray.Add('Value') #调用Add方法,添加元素。 [void]为了避免多余输出。