powershell数组的使用

基本使用

$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]为了避免多余输出。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值