免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1806 | 回复: 0

[学习共享] ps第9课:powershell数组(静态,动态) [复制链接]

论坛徽章:
0
发表于 2017-09-20 15:36 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2019-04-22 15:11 编辑

我初学ps时,很困扰,到处去问:
为啥【get-content a.txt】会返回一个,以行分割的数组。
答:就是这样设计的。cr,lf,crlf,都能正常分割。


问:神马是数组?
答:
是最最常用的变量类型。
比如:打开一个888行的文本文件,即把这个文件拆分成888行,然后放入一个数组,数组中含888个元素。
你可以用:
$打开的文件[0] 得到文件第一行数据,
$打开的文件[887] 得到文件最后一行数据,
$打开的文件[-1] 得到文件最后一行数据,


问:如何建立数组?
答:
$a = 1,2,3
$b = 'a','b','c'


问:如何建立数组2?
答:
$a = 1..5
$b = 999..2kb
powershell 6.0 新增,数组语法糖:
'a'..'z'
'z'..'a'
'c'..'g'
'A'..'Z'

支持中文,但若想使用,必须让区位码相连的,有意义的字符才有用。
例子:
[char]27721 #返回�汉
[char]27726 #返回�汎
'汉'..'汎' #则返回【汉】的区位码,到【汎】区位码之间的字符。汉,汊,汋,汌,汍,汎。好像这样没啥用。
'㈠'..'㈩' #返回㈠,㈡,。。㈩,这样就有用了。
记住,只限于powershell 6.0



问:数组中的每个元素,类型必须一样吗?
答:
不用。
$a = dir
返回的数组中,既有文件对象,也有目录对象。


问:如何【强制】建立数组?
答:
$a = @(netstat)  
[array]$a = netstat
[string[]]$a = 'abcd'  #建立只有1个元素的数组,而不是字符串。



问:如何建立有n个元素的,空数组?
答:
$a = [System.Array]::CreateInstance([int],元素个数)
$52张牌 = New-Object  "system.array [][]"  4,13  #建立空二维数组例子



问:数组有3个元素abc,我想循环取出,那么如何重复生成abc,abc?
答:
for 循环,$i / 3 ,然后取余数:
$a = 'a','b','c'
for ($i=0; $i -lt 100; $i++)
{
#传教士原创小技巧哦
    $b = $i % 3
    write-host $a[$b]
}
http://bbs.chinaunix.net/thread-4266982-1-1.html



问:数组中的【第一个】元素,索引值是多少?
答:
0


问:数组可以用【字符串】做索引值吗?
答:
不行。


问:数组可以用【变量名】做索引值吗?
答:
可以,但【变量值】必须是数字。


问:如何【读取】数组中的元素值?
答:
[array]$a = netstat
$a[7]
$a[-3]
$a[3..5] #返回4----6个元素,即文本的4---6行。
$a[3,5] #返回第4行,第6行
$a[3..6,5..11] #这样不行
$b = $a[3..6] + $a[5..11] #这样可以
$bbb,$ccc=$a[0,2]  把数组a的第一个值给$bbb,第二个值给$ccc
$a.GetValue($索引位置) #.net写法读取数组的值。
$a.GetValue($值,$索引位置,$索引位置) #给二维数组,读取值



问:如何【写入】数组中的元素值?
答:
$a = 1,2,3
$a[1] = 'zzz' #改变第二个元素值
$a
$a.SetValue($值,$索引位置) #.net写法写入数组的值。
$a.SetValue($值,$索引位置,$索引位置) #给二维数组,写入值


问:读取数组中元素,索引超过数组界限,会报错吗?
答:
不会。
$a = 1,2
$a[888]  #不会报错
$a[888] -eq $null #返回 true

作业题:
$a = 1,2,3,4
$a[1,$null,$b]
会返回啥?

数组引用时,带有空格可以么?
$a = 1,2,3
$a[ 0 ]
$a[ 1]
$a[2]
===========================================


问:【动态数组】,【数组】有啥区别?
答:
普通数组,从建立的时候,【元素数目】就定死了。每增加一个元素,要重新建立数组,特别慢。
所以只适合少量数据。基本上,数组追增加500个以上元素,就要用动态数组。
【动态数组】可以插入,追加,可以删除元素。

问:神马是【自动去重】数组?
答:
和python的set对象一样。只要往这个对象中狂插元素,即可自动去重。还可以求两个数组的交集,并集,差集。
https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.hashset-1?redirectedfrom=MSDN&view=netframework-4.7.2


问:如何建立【自动去重】数组?
答:
[System.Collections.Generic.HashSet[string]]$myhashset2 = @()

问:如何判断重复?
答:
还是看msdn上的hashset手册,中的add方法。这个方法返回真假返回值。具体:
if  ($myhashset.add($要去重的值))
{
#添加成功,没重复
}
else
{
#$myhastset 对象中,已经有 $要去重的值 了。
}



问:如何判断数组中,有重复?
答:
方法2:
判断一个数组当中,有没有相同的元素?  
对数组去重,然后判断数组的元素数个数,是否和没去重前一样即可。
$array1 = 'a','b','c','d','e','f','a'
$array2 = $array1 | Sort-Object -Unique
if ($array1.count -eq $array2.count)
{
    write-host '数组没重,ps1大发好!'
}
else
{
    write-host '数组中元素有重复的'
}
也可以用去重数组(hashset)来判断,道理相同。


问:可以把字符串,当成数组,访问其中的单个元素吗?
答:
可以,但是只能读。
[string]$a = 'abcdefghijklmn'
for ($i=0;$i -lt $a.Length;$i++)
{
    write-host $a[$i]
}
write-host '---分割线上面是for加加,下面是for减减---'
for ($ii=$a.Length;$ii -ge 0;$ii--)
{
    write-host $a[$ii]
}
win7 + powershell2.0 测试通过



问:如何把数组,组合成字符串?
答:
$sz = 'a','b'
$st1 = -join $sz #ab
$st2 = [system.String]::Concat($sz) #ab
$st3 = $sz -join '分隔符' #a分隔符b



问:静态数组可以用【+】,相加吗?
答:
本质上是新建了1个数组,含有两个数组元素的和。记住:这样很慢。
虽然可以这样用,但不靠谱,会有问题。所以基本不能这样用。请看失败例子:
=========
$a = 1,'a',2
$b = 'hh',(get-date)
$c = $a + $b
$c
日期前面会有空行。
==========
用[System.Collections.ArrayList]的add方法就没有这个问题。



问:如何【查找+替换】数组中的元素?
答:
$array = "1","2","2","4"
$array = [regex]::replace($array,"2","aaa")
$array = $array -replace "2","aaa" #另一种写法,作用同上。


问:如何判断数组中,是否包含某元素?
答:
$array = 'a','b','c'
$array.Contains()
用.contains()方法的时候要注意,对象是数组还是字符串。
-in,-notin: ps3.0,和以上版本可用
-contains,-notcontains:相当于反过来的in和notin

==========================================================
问:静态数组,基于哪个.net对象,手册在哪?
答:
[system.Array]
https://docs.microsoft.com/zh-cn/dotnet/api/system.array?redirectedfrom=MSDN&view=netframework-4.7.2

问:静态数组,有哪些常用属性?
答:
length:数组长度

问:静态数组,有那些常用方法?
答:
[System.Array]::BinarySearch($数组名,'元素值') #返回索引位置,需要先手动排序!
[System.Array]::IndexOf(Array,Object) #查找第一个元素
[System.Array]::LastIndexOf(Array,Object) #查找最后一个元素
[System.Array]::Clear($数组名,$起始索引,$元素个数) #将数组某个范围值,设为默认值
[System.Array]::ConstrainedCopy(Array,Int32,Array,Int32,Int32) #使用事务,复制粘贴数组
[System.Array]::Copy(Array,Int32,Array,Int32,Int32) #复制粘贴数组
数组对象.CopyTo(Array,Int64) #复制数组
[System.Array]::ConvertAll() #转换数据类型
[System.Array]::CreateInstance(Type,Int32) #创建1维数组
[System.Array]::CreateInstance(Type,Int32,Int32,) #创建2维数组
[System.Array]::Empty() #创建空数组
.GetValue(Int32) #获取值
.SetValue(值,Int32) #写入值
[System.Array]::Reverse(Array)       #翻转【原数组!】顺序
[System.Array]::Reverse(Array, Int32, Int32)  #翻转部分顺序
[array]::Sort($数组名) #排序,注意对源数组排序,改变源数组值。

IList.Contains(Object)   确定某元素是否在 IList 中。
IList.IndexOf(Object) 确定 IList 中特定项的索引。
IList.Insert(Int32, Object) 在 IList 中的指定索引处插入一个项。
IList.Remove(Object) 从 IList 中移除特定对象的第一个匹配项。
IList.RemoveAt(Int32) 移除位于指定索引处的 IList 项。


--------------------------------
不常用方法:
find          #查找并返回元素
findall
FindIndex<T>  #查找病返回索引
FindLast<T>
FindLastIndex<T>
[Array]::Findindex(@('bbb','aaa','ccc'), [Predicate[string]]{ $args[0] -eq 'aaa' })
ForEach<T>
==========================================================
问:动态数组,是哪个对象,手册在哪?
答:
[System.Collections.ArrayList]
https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.arraylist?redirectedfrom=MSDN&view=netframework-4.7.2
本质上非线程安全

问:如何建立【动态】数组?
答:
[System.Collections.ArrayList]$动态数组 = @()


问:动态数组有哪些常用属性?
答:
count:数组长度
Capacity:数组大小
Item[Int32]:获取或设置索引处的元素的值。

问:动态数组有那些常用方法?
答:
[System.Collections.ArrayList]::Repeat(元素,复制次数) #新建,n个元素的,动态数组
.Add(Object) #追加
.AddRange(ICollection) #追加范围
.Clear() #清空,数组长度变0
.Clone() #复制
.CopyTo(Array) #复制到另一个数组
.Contains(Object) #测试是否包含
.Finalize() #垃圾回收
.GetRange(Int32,Int32) #返回子集
.SetRange(Int32,ICollection) #设置子集
.IndexOf(Object,Int32) #查找,返回从索引开始,后的第一个元素
.LastIndexOf(Object) #查找,返回从索引开始,后的最后一个元素
.Insert(Int32,Object) #插入
.InsertRange(Int32,ICollection) #插入集合
.Remove(Object) #删除
.RemoveAt(Int32)
.RemoveRange(Int32, Int32)
.Reverse() #反转
.Sort() #排序
.TrimToSize() #缩小数组,到实际元素数量。
动态数组真题例子:
http://bbs.chinaunix.net/thread-4267031-1-1.html
http://bbs.chinaunix.net/thread-4256215-2-1.html

==========================================================
二维数组
[string[][]]$aaa= "a,b","b","c","d","e","f"
返回
{{a,b}, {b}, {c}, {d}, {e}, {f}}

#二维数组当然是一元素中含两个值
$每元素含二个值_共三个元素的例子 = @((0,60000),(60001,120000),(120001,180000))
$每元素含二个值_共三个元素的例子[0][1]
$每元素含二个值_共三个元素的例子 += ,('猪都能懂','傻都会改')

$一个元素_并且是空的二维数组 = ,@(@(),@())
$一个元素_并且是null的二维数组 = New-Object  'system.array [][]' 1,2  #数组count为1,即【$一个元素_并且值是$null的二维数组[0]】。数组每一个元素含有2个元素。
$一个元素_并且是null的二维数组2 = ,@($null,$null)

二维数组具体例子为:
群共享---》ps命令行游戏,抽一张牌比大小poker_v1.05.ps1
其中:
$52张牌 = New-Object  "system.array [][]"  4,13
代表4个花色,每个花色13张牌。
==========================================================
三维数组
$三维数组 = New-Object  'system.array [][][]' 2,5,1
$三维数组[因为设定为2。所以取值范围0,1][取值范围,0,1,2,3,4][取值范围,只能是0]
$三维数组[1][3]中,含有一个元素,$三维数组[1][3][0]



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP