PowerShell 语法在学习语法之前,我们首先必需务必要搞懂几个问题:PowerShell是什么类型的语言,是强类型还是弱类型,是静态的还是动态的?把语言的性质弄清楚,再开始学习语法;有助于我们更好地深入理解。无论学习什么编程语言,了解它是什么类型才是学习其语法的第一步;也是深入学习其精髓所在,更好地区别于其它编程语言。综合以上内容,可得出PowerShell实际上是一门动态的弱类型脚本解释语言。
$a = "PowerShell" # 声明变量a并赋值,用$美元符号标识
$a.GetType() # 获取变量a的数据类型 String:字符串
$local:b # 声明局部变量
$glocal:b = 12 # 定义全局变量
……
# 脚本变量和私有变量,如法炮制(同上)代码演示效果,所用PowerShell版本为5.1
变量修饰符$local ---- 局部变量局部变量,作用范围:变量将只在局部范围内创建。这是未指定范围的变量的默认值。Localvariables可以从源自currentscope的作用域读取,但是不能修改它们$script ---- 脚本变量脚本变量,作用范围:该变量仅在脚本中有效,但在脚本中的所有位置均有效。因此,脚本中的函数可以处理其他变量,而这些变量在脚本中定义时不在函数内。$global ---- 全局变量全局变量,作用范围:这个变量在任何地方都是有效的,即使是在函数和脚本之外。$private ---- 私有变量私有变量,作用范围:该变量将仅在当前作用域中创建,而不会传递到其他作用域。 因此,它只能在当前范围内读写代码演示效果,所用PowerShell版本为5.1,若有不同,请升级版本
PowerShell的变量也能像Python那样进行多元赋值,而且还不是简简单单
$x,$y,$z = 1,-1,1
$x
res: 1
$y
res: -1
$z
res: 1
$i,$j = 0,1,2
$i
res: 0
$j
res: 1,2 # 这里j变量显然变成是数组
$j -is [array]
res: True
# 那试试传入数组,看看行不行
$a,$b = 0,1..5
无法将“System.Object[]”类型的“System.Object[]”值转换为“System.Int32”类型。
# 这里需要转换,加个“()”
$a,$b = 0,(1..5),6,7,8,9,10
$a
res: 0
$b
res: 1
2
3
4
5
6
7
8
9
10
# 奥利给【笑容正逐渐……】
PowerShell 内置变量1.$$
此变量用于表示会话接收到的最后一行中的最后一个令牌。
2.$?
此变量用于表示最后一个操作的执行状态。如果没有错误,则返回True,否则返回False。
3.$^
此变量用于表示会话接收到的最后一行中的第一个令牌。
4.$_
此变量充当$PSItem,它在管道对象中包含当前对象。
5.$args
此变量包含未声明参数的值的数组,这些值传递给脚本,函数或脚本块。
6.$ConsoleFileName
此变量用于表示控制台文件的路径,该文件最近在会话中使用。
7.$Error
此变量用于包含代表最新错误的错误对象数组。
8.$Event
此变量用于包含PSEventArgs的对象。PSEventArgs是用于表示正在处理的事件的对象。
9.$EventSubscriber
此变量用于包含PSEventSubscriber的对象。该对象包含正在处理的事件的事件订阅者。
10.$EventArgs
此变量用于包含一个对象,该对象表示第一个事件的参数。
11.$false
此变量用于表示False。
12.$foreach
此变量用于包含ForEach循环的枚举数。该变量仅在执行ForEach循环时存在。并在循环完成后删除。
13.$Home
此变量用于表示用户主目录的完整路径
14.$input
此变量包含一个枚举器,该枚举器枚举传递给该函数的所有输入。它仅适用于脚本块和功能。
15.$Host
此变量包含一个对象,该对象显示Windows PowerShell的当前主机应用程序。
16.$IsLinux
如果当前会话在Linux操作系统上运行,则此变量值为$True,否则为$False。
17.$IsWindows
如果当前会话在Windows操作系统上运行,则此变量值为$True,否则为$False。
18.$IsMacOS
如果当前会话在MacOS操作系统上运行,则此变量值为$True,否则为$False。
19.$null
此变量用于表示null值或空值。可以使用它来表示脚本和命令中缺少或未定义的值。
20.$PID
此变量显示进程的PID,该进程正在托管当前PowerShell的会话。
21.$PSItem
此变量充当$_,它在管道对象中包含当前对象。
22.$PSHome
此变量表示Windows PowerShell安装目录的完整路径。
23.$PSVersionTable
此变量用于表示只读哈希表,该哈希表显示有关当前会话中运行的PowerShell版本的详细信息。
24.$PWD
此变量用于包含路径对象,该路径对象显示当前目录的完整路径。
25.$ShellId
此变量用于表示当前Shell的标识符。PowerShell 变量类型和"强类型"
PowerShell会根据数据自动分配最适合的数据类型,就不会担心数据超出原定数据类型的上限而导致数据溢出;可以通过GetType()方法中Name属性获取PowerShell为你的变量选择的数据类型,听起来好像很不错!
(1000000000).gettype().name
res :Int32
(10000000000).gettype().name
res :Int64
(3.14).gettype().name
res :Double
(3.14d).gettype().name
res :Decimal
("PowerShell").gettype.name
res :String这种类型自适应也称“弱类型”,但是机子不会像我们那么灵活、多变,就是不太聪明的亚子;如果它一开始就给我的变量赋了错误的类型,我们还没发现这个错误,引发的后果可想而知;感觉自己的命脉都掌握在不太聪明亚子机身上,作为专业【上流】的程序员或脚本开发者一定不允许;所以就有了“强类型”,哪怕赋值时类型不兼容导致报错,毕竟每个变量都清楚知道自己给了什么数据类型。
$i = "11" # 定义一个变量i,这变量是int类型;但赋值时给了字符串
$i.gettype().name # PowerShell自动分配数据类型为字符串,完了GG了【捂脸】【捂脸】;果然它真是不太聪明的亚子机。
[int]$i = "11" # 那就靠人工指定类型
$i.gettype().name # 这时,变量i的数据类型为int32;脸上正逐渐露出满意的【柴犬式微笑】,奥利给,哈哈哈哈哈
[int]$j = "10000000000" # 这里会报错:超出int32上限,数据溢出。
常用的存储数据类型(都有增、删、改、查的操作)数组 === [Array]
$arr1 = @() # 创建空数组
$arr1.count # 验证数组是否为空的,没有元素
res: 0
$arr2 = (1,2,3,4,5) # 定义固定长度的数组
res:1,2,3,4,5
$arr3 = 1..5 # 利用语法糖“..”(运算符)定义数组
res: 1,2,3,4,5
$arr1 -is [Array] # 用类型运算符进行验证是否为数组类型
res: True
1..5 -is [Array] # 可看出“..”,应该是数组运算符
res: True
$arr2.length # 获取数组长度
res: 5
$arr2.count # 获取数组个数
res: 5
$arr2[2] # 获取数组元素,下标从零开始
res: 3
$arr2[1,3,4] # 获取数组多个元素,下标用“,”隔开
res: 2,4,5
$arr4 = $arr2[-1,1,0] # 还可以做数组赋值给变量
$arr4
res: 5,2,1
$arr4 += 6
$arr4 += 7
$arr4
res: 5,2,1,6,7
$arr4[0] = -1
$arr4
res: -1,2,1,6,7
$arr4 = $arr4[1..($arr4.length-1)]
$arr4
res: 2,1,6,7
$arr4.length # 查看数组长度的变化
res: 4
$arr4 = $arr4[0..($arr4.length-2)]
$arr4
res: 2,1,6
$arr3 = $arr3[($arr3.length-1)..0]
$arr3
res: 5,4,3,2,1
$arr5 = $arr3.clone()
$arr5
res: 5,4,3,2,1
$arr3[0] = -1
$arr3
res: -1,4,3,2,1
$arr5
res: 5,4,3,2,1哈希表 === [Hash]
$dict = @{Author = "@莫名的墨迹";Write_Content = "PowerShell"}
$dict
res: Author --- @莫名的墨迹
res: Write_Content --- PowerShell
$key = "Author"
$dict.$key # 访问键来获取键值
res: @莫名的墨迹
$keys = "Author","Write_Content"
$dict[$keys] # 通过创建数组方式,来获取多个键值
res: Author --- @莫名的墨迹
res: Write_Content --- PowerShell
$dict.keys # 也可以通过属性来打印全部键
res: Author Write_Content
$dict1 = @{ Work_Content = 10;Work_Out = 5,2,1}
$dict1.Work_Out
res: 5
res: 2
res: 1
$dict1["Work_Attention"] = 5
$dict
res: Work_Content --- 10
res: Work_Out --- {5,2,1}
res: Work_Attention --- 5
$dict1.remove("Work_Attention")
$key = "Work_Content"
$dict[$key] = 3
$dict[$key]
res: 3