PS编程基础入门2
时间:2022-07-28
本文章向大家介绍PS编程基础入门2,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[TOC]
PS 数组和哈希表
描述:数组引入PS会将命令执行后的结果文本按每一行作为元素存为数组,在命令的返回值不止一个结果时,PS也会自动把结果存储为数组。
- 数组的多态:PS中数组像变量一样如果数组中元素的类型为弱类型,默认可以存储不同类型的值。
- PS数组在内存中是顺序存储的,所以数组的大小必须是确定的方便分配存储空间
- 数组属于引用类型,使用默认的的赋值运算符在两个变量之间赋值只是复制了一个引用两个变量共享同一份数据,则改变一个另一个也会相应的改变;
常规PS数组
基础示例:
#1.PS将命令执行后返回的结果存入到数组之中
PS > $IP=IPCONFIG
PS > $IP -is [array]
True
PS > $IP.getType()
# IsPublic IsSerial Name BaseType
# -------- -------- ---- --------
# True True Object[] System.Array
PS > $IP.Count #看数组的元素个数用$array.Count属性
32
#访问第x个元素,使用$array[x-1],因为数组是以0开始索引的。
PS > $IP[4]
#以太网适配器 以太网:
PS > $IP[8]
# IPv4 地址 . . . . . . . . . . . . : 10.0.0.19
思考为什么不愿把IPconfig返回的结果称为对象? 答:因为它不是真正Cmdlet命令,真正的Powershell命令返回的数组元素可不止一个字符串,它是一个内容丰富的对象。
1.数组创建
- 使用@()创建数组
- 使用@{}创建哈希表
PS > $array[email protected]() #空数组
PS > $array=1,2,3,4,5 #常规定义数组
PS > $array=1..5 #连续的数字数组(推荐方式)
PS > $array=1,1.2,"String" #多种数据类型融合的数组
PS > $array -is [array]
True
PS > $array.Count #元素个数
3
PS > $arr=1..3
PS > $arr+=5..8 #突发奇想给数组添加数组
PS > $arr
1
2
3
5
6
7
8
#所以给数组增加元素其实相当于创建一个新的数组,只不过之后会把原来的副本删除。在当前数组追加元素可以使用“+=”操作符。
PS C:Powershell> $books="元素1","元素2","元素3"
PS C:Powershell> $books+="元素4"
PS C:Powershell> $books
元素1
元素2
元素3
元素4
2.数组访问
PS > $arr[0] #元素都是从0下标开始索引的
1
PS > $arr[($arr.Count-1)] #输出最后一个元素
8
PS > $arr[0,1,3,5] ##一次输出多个元素 (值得学习)
1
2
5
7
PS > $arr[($arr.Count)..0] #将数组逆序输出 (值得学习)
8
7
6
5
3
2
1
PS > $arr = 1..3
PS > $arr = $arr[1..2] + 4..6 #数组之间可以直接追加元素或者删除元素
PS > $arr
2
3
4
5
6
3.复制数组 描述:复制数组最好使用Clone()方法,除非有特殊需求。
PS > $arr=1..3
PS > $arr1=$arr
PS > $arr1.Equals($arr) #两个变量指向同一个地址的数组(表示是相同的)
True
PS > $arr2=$arr.Clone() #一个新的数组不是两个变量指向同一个数组
PS > $arr2.Equals($arr) #这里是为False
False
PS > $arr2[0]=1024
PS > $arr2
1024
2
3
强类型数组
描述:数组一般具有多态性,如果你不指定元素的具体类型,解释器会自动选择合适的类型存储每个元素
。
- 如果要统一限制所有元素的类型,可是使用类型名和一对方括号作为数组变量的类型。
- 每当赋值时会自动类型检查, 如果目标数据类型不能转换成功,就会抛出一个异常。
基础示例:
PS > [int[]] $num = @()
PS > $num += 1024
PS > $num += 3.1415926 #这里由于强制类型的作用(会直接忽略小数点后的数字)
PS > $num += 999
PS > $num
1024
3
999
哈希表(HASH)
描述:哈希表存放的是键值对(Key-Value),在哈希表中不再仅仅限制使用数字寻址,可以使用任意类型的数据类型寻址
。
在创建哈希表时就使用数组,因为创建数组和哈希表的的元素关键字不冲突一个是逗号,一个是分号
。
PS > $hash[email protected]{ Name="WeiyiGeek";Age="15" } #创建一个HASH表示
PS > $hash['Name'] #使用哈希表的键访问对应的值
WeiyiGeek
PS > $hash.Keys #HASH表的所有键
Age
Name
PS > $hash.Values #HASH表的所有值
15
WeiyiGeek
PS > $hash.Count #HASH表的键值对数量
2
PS > $hash[email protected]{ Name="WeiyiGeek";Age="15"; Books="C","C++","PYTHON"} #在哈希表中存储数组
PS > $hash.Sex="Woman"
PS > $hash
# Name Value
# ---- -----
# Books {C, C++, PYTHON}
# Name WeiyiGeek
# Age 15
# Sex Woman
#哈希表值的更新和删除
PS > $hash.Name="weiyi"
PS > $hash.remove("Books")
PS > $hash
# Name Value
# ---- -----
# Name weiyi
# Age 15
# Sex Woman
使用哈希表格式化输出 PS许多命令的输出结果都是以表格的形式,当然可以使用Format-Table自定义表格格式,例如:
PS C:Powershell> Dir | Format-Table FullName,Mode #命令只能限制表格输出那些列,隐藏那些列,但是对于列的宽度,列标题无能为力
FullName Mode
-------- ----
C:PowershellABC d----
C:Powershellmyscript d----
C:Powershella.html -a---
#表格的每一个列包含四个属性:
* Expression:绑定的表达式
* Width:列宽度
* Label:列标题
* Alignment:列的对齐方式
PS > $column1 = @{expression="Name"; width=30;label="filename"; alignment="left"}
PS > $column2 = @{expression="LastWriteTime"; width=40;label="last modification"; alignment="right"}
PS > ls | Format-Table $column1, $column2
# filename last modification
# -------- -----------------
# .android 2019/7/26 8:45:03
# .config 2019/8/19 17:27:45
PS 条件判断
比较运算符:
-eq :等于
-ne :不等于
-gt :大于
-ge :大于等于
-lt :小于
-le :小于等于
-contains :包含
-notcontains :不包含
布尔运算符号:
-and :和
-or :或
-xor :异或
-not :逆
条件判断语法:
- Where-Object
- IF-ElseIf-Else
- Switch
ForEach
PS C:Powershell> ls | ForEach-Object {"文件名:{0} 文件大小{1}KB: " -f $_.Name,($_.length/1kb).tostring()}
文件名:a.html 文件大小65.99609375KB:
文件名:a.txt 文件大小25.765625KB:
文件名:alias 文件大小11.77734375KB:
PS 函数
描述:函数就是将大大小小的命令组合成一个集合里面进行执行,有利于提高代码复用以及简练代码量;
#
function Test-conn {
Test-Connection -Count 2 -ComputerName $args
}
Set-Alias tc test-conn
PS C:PS> tc localhost
- 多迪技术总监揭秘:前端工程师主要做什么?前景怎么样?
- c#:Reflector+Reflexil 修改编译后的dll/exe文件
- testNG java.net.SocketException: Software caused connection abort: socket write error
- MyBatis.Net 学习手记
- 基于JavaScript 声明全局变量的三种方式详解
- 网页基础篇之如何制作简单的静态网页
- Mybatis.Net 整合 ODP.NET Managed
- 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement
- 知道这几点,用微信小程序留住海量客户不是问题
- C#:DataTable映射成Model
- jenkins 多选框
- Oracle:ODP.NET Managed 小试牛刀
- C#:Func的同步、异步调用
- Python之路-day6
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RSA
- Syncd - 开源自动化部署工具
- pointer-events:none禁用鼠标事件
- TiCDC 首个 GA 版本发布,特性与场景全揭秘
- Linux远程ssh执行命令expect使用及几种方法
- 数据结构--线性表和链表的基础知识
- Salesforce LWC学习(二十五) Jest Test
- 自建npm包-搭建,打包,调试,发布
- 你对排序算法了解多少
- 【大数据架构】大数据数据仓库与数据中台架构
- JavaScript中的内置对象、面向对象与原型
- Java.lang.Illegalaccessexception 或 java.lang.NoSuchMethodError
- Python 爬虫进阶必备 | 关于某电商 token 参数加密逻辑分析
- Python 爬虫进阶必备 | 某直播数据分析平台加密参数 sign 分析
- Python 爬虫进阶必备 | 某指数分析平台解密逻辑分析