PowerShell命令与脚本(4)——数组和哈希表
PowerShell命令返回数组
当我们把一个命令的执行结果保存到一个变量中,可能会认为变量存放的是纯文本。
但是,事实上Powershell会把文本按每一行作为元素存为数组。如果一个命令的返回值不止一个结果时,Powershell也会自动把结果存储为数组。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140531646-1541808269.jpg)
1、使用数组存储结果
判断一个变量是否为数组
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140538374-1320314461.jpg)
查看数组的元素个数用$array.Count属性。访问第x个元素,使用$array[x-1],因为数组是以0开始索引的。
2、使用管道对数组进一步处理
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140545982-1546011058.jpg)
3、使用真实的对象操作
为什么不愿把IPconfig返回的结果称为对象,因为它不是真正Cmdlet命令,真正的Powershell命令返回的数组元素可不止一个字符串,它是一个内容丰富的对象。
数组的每一个元素存放的是一个System.IO.DirectoryInfo对象。
当我们输出这些对象时,Powershell会自动帮我们把它转换成友好的文本格式。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140557083-2036102851.jpg)
对于任何一个对象都可以使用Format-List * 查看它所有的属性和方法。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140625237-1125536196.jpg)
PowerShell创建数组
1、创建数组
在Powershell中创建数组可以使用逗号。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140644025-1184008423.jpg)
对于连续的数字数组可以使用一个更快捷的方法
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140652933-138644674.jpg)
2、数组的多态
像变量一样如果数组中元素的类型为弱类型,默认可以存储不同类型的值。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140705377-625624641.jpg)
3、空数组和单元素数组
空数组
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140720351-651128720.jpg)
1个元素的数组
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140726816-877154868.jpg)
PowerShell访问数组
1、选择数组中的元素
数组的元素可以使用索引寻址,第一个元素的索引为0,第i个元素的索引为i-1,最后一个元素的索引为Count-1,但是Powershell为了使用方便,直接可以将 -1 作为最后的一个元素的索引。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140736694-82914620.jpg)
2、从数组中选择多个元素
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140746152-522777527.jpg)
3、将数组逆序输出
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140759358-1534941213.jpg)
4、给数组添加和删除元素
因为Powershell数组在内存中是顺序存储的,所以数组的大小必须是确定的,这样才方便分配存储空间,所以给数组增加元素其实相当于创建一个新的数组,只不过之后会把原来的副本删除。在当前数组追加元素可以使用“+=”操作符。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140829272-1462542197.jpg)
要删除第三个元素可以使用
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140843309-853546536.jpg)
PowerShell复制数组
数组属于引用类型,使用默认的的赋值运算符在两个变量之间赋值只是复制了一个引用,两个变量共享同一份数据。这样的模式有一个弊病如果其中一个改变也会株连到另外一个。所以复制数组最好使用Clone()方法,除非有特殊需求。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140855712-466719606.jpg)
PowerShell强类型数组
Powershell数组一般具有多态性,如果你不指定元素的具体类型,解释器会自动选择合适的类型存储每个元素。如果要统一限制所有元素的类型,可是使用类型名和一对方括号作为数组变量的类型。这样每当赋值时,会自动类型检查。如果目标数据类型不能转换成功,就会抛出一个异常。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140911332-355004360.jpg)
PowerShell哈希表
1、哈希表的创建
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。
哈希表存放的是键值对,在哈希表中不再仅仅限制使用数字寻址,可以使用任意类型的数据类型寻址。
之前使用@()创建数组,现在使用@{}创建哈希表,使用哈希表的键访问对应的值。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140931375-1761476652.jpg)
2、在哈希表中存储数组
可以在创建哈希表时就使用数组,因为创建数组和哈希表的的元素关键字不冲突。一个是逗号,一个是分号。
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625140939755-563755102.jpg)
3、在哈希表中插入新的键值
在哈希表中插入新的键值很方便,象定义变量一样,可以直接拿来使用
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625141004565-529335092.jpg)
4、哈希表值的更新和删除
如果要更新键的值,可以直接重写。如果要删除这个键值对,可以使用Remove方法,参数为Key
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625141015588-421104279.jpg)
5、使用哈希表格式化输出
列表清单输出与表格输出的区别:
清单列表输出:Format-List(别名fl):以键值对的形式输出
表格格式输出:Format-Table(别名ft):以表格化的形式输出
在Powershell中哈希表的一个有趣的应用可以用来格式化文本输出。Powershell许多命令的输出结果都是以表格的形式,当然可以使用Format-Table自定义表格格式
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625141033828-1813297507.jpg)
上述的命令只能限制表格输出那些列,隐藏那些列。但是对于列的宽度,列标题无能为力,但是有了哈希表就可以实现更多自定义了。
表格的每一个列包含四个属性:
- Expression:绑定的表达式
- Width:列宽度
- Label:列标题
- Alignment:列的对齐方式
![](https://img2020.cnblogs.com/blog/1942601/202106/1942601-20210625141044554-1559125730.jpg)