忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1105 | 回复: 0

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

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

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


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

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


问:如何【强制】建立数组?
答:
$a = @(netstat)  
[array]$a = netstat

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

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




http://bbs.chinaunix.net/thread-4266982-1-1.html

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


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


问:神马是【自动去重】数组?
答:
和python的set对象一样。只要往这个对象中狂插元素,即可自动去重。还可以求两个数组的交集,并集,差集。
https://msdn.microsoft.com/zh-cn/library/bb359438(v=vs.110).aspx


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

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



问:如何判断数组中,有重复?
答:
方法2:
判断一个数组当中,有没有相同的元素?  
对数组去重,然后判断数组的元素数个数,是否和没去重前一样即可。
  1. $array1 = 'a','b','c','d','e','f','a'
  2. $array2 = $array1 | Sort-Object -Unique
  3. if ($array1.count -eq $array2.count)
  4. {
  5.     write-host '数组没重,ps1大发好!'
  6. }
  7. else
  8. {
  9.     write-host '数组中元素有重复的'
  10. }
复制代码


也可以用去重数组(hashset)来判断,道理相同。

问:数组中的【第一个】元素,索引值是多少?
答:
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


问:可以把字符串,当成数组,访问其中的单个元素吗?
答:
可以,但是只能读。

  1. [string]$a = 'abcdefghijklmn'
  2. for ($i=0;$i -lt $a.Length;$i++)
  3. {
  4.     write-host $a[$i]
  5. }
  6. write-host '---分割线上面是for加加,下面是for减减---'
  7. for ($ii=$a.Length;$ii -ge 0;$ii--)
  8. {
  9.     write-host $a[$ii]
  10. }
复制代码

win7 + powershell2.0 测试通过



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



问:静态数组可以用【+】,相加吗?
答:
可以,本质上是新建了个数组,含有两个数组元素的和。记住:这样很慢。
$a = 1,'a',2
$b = 'hh',(get-date)
$c = $a + $b


问:如何【查找+替换】数组中的元素?
答:
$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://msdn.microsoft.com/zh-cn/library/czz5hkty(v=vs.110).aspx

问:静态数组,有哪些常用属性?
答:
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]
http://msdn.microsoft.com/zh-cn/library/system.collections.arraylist.aspx
本质上非线程安全

问:动态数组有哪些常用属性?
答:
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 [][]' 1,2,3
$三维数组[0] 中含有:
$三维数组[0][0]
$三维数组[0][1]
两个元素
,,
而【$三维数组[0][0]】中,含有0,1,2,三个元素。



================================================

powershell脚本第一课:面向对象简介1
http://bbs.chinaunix.net/thread-4263988-1-1.html

ps第二课:常用对象类型
http://bbs.chinaunix.net/thread-4264061-1-1.html

ps第三课:面向对象语言有啥优缺点?
http://bbs.chinaunix.net/thread-4264062-1-1.html

ps第4课:文件目录对象介绍
http://bbs.chinaunix.net/thread-4264293-1-1.html

ps第5课:常用帮助命令
http://bbs.chinaunix.net/thread-4264294-1-1.html

ps第6课:单个字符对象,讲ps如何处理单个字符,含汉字
http://bbs.chinaunix.net/thread-4264556-1-3.html

ps第7课:powershell到底有何优势,为什么要学?
http://bbs.chinaunix.net/thread-4264776-1-1.html

ps第8课:用powershell读写文本、二进制文件。
http://bbs.chinaunix.net/thread-4266404-1-1.html

ps第9课:powershell数组(静态,动态)
http://bbs.chinaunix.net/thread-4267455-1-1.html
--------------------------------------------------------
字符界面版,powershell2048游戏。win_linux_通用
http://bbs.chinaunix.net/thread-4260709-1-1.html

http://bbs.chinaunix.net/thread-4266193-1-1.html
跨平台ps命令行游戏:《抽一张扑克牌比大小.ps1》



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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP