PowerShell 语法
在学习语法之前,我们首先必需务必要搞懂几个问题:PowerShell是什么类型的语言,是强类型还是弱类型,是静态的还是动态的?把语言的性质弄清楚,再开始学习语法;有助于我们更好地深入理解。无论学习什么编程语言,了解它是什么类型才是学习其语法的第一步;也是深入学习其精髓所在,更好地区别于其它编程语言。
powershell 是一门强类型语言吗?(与Stack OverFlow相仿的网站,支持中文搜索)
PowerShell 是一门强类型语言吗?(Stack OverFlow)
PowerShell 是什么语言?(StackOverFlow)
综合以上内容,可得出PowerShell实际上是一门动态的弱类型脚本解释语言。
$a = "PowerShell" # 声明变量a并赋值,用$美元符号标识
$a.GetType() # 获取变量a的数据类型 String:字符串
$local:b # 声明局部变量
$glocal:b = 12 # 定义全局变量
……
# 脚本变量和私有变量,如法炮制(同上)
变量修饰符
$local ---- 局部变量
- 局部变量,作用范围:变量将只在局部范围内创建。这是未指定范围的变量的默认值。Localvariables可以从源自currentscope的作用域读取,但是不能修改它们
$script ---- 脚本变量
- 脚本变量,作用范围:该变量仅在脚本中有效,但在脚本中的所有位置均有效。因此,脚本中的函数可以处理其他变量,而这些变量在脚本中定义时不在函数内。
$global ---- 全局变量
- 全局变量,作用范围:这个变量在任何地方都是有效的,即使是在函数和脚本之外。
$private ---- 私有变量
- 私有变量,作用范围:该变量将仅在当前作用域中创建,而不会传递到其他作用域。 因此,它只能在当前范围内读写
PowerShell的变量也能像Python那样进行多元赋值,而且还不是简简单单
<# python: a,b = 0,1
多元赋值,其原理是元组作用
但是,a,b,c = 1,2,3,4 这样会报错
#>
$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 = @(1,2,3,4,5)
$arr2 = (1,2,3,4,5)
$arr3 = 1..5
#>
$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
<# 判断数据类型
类型运算符
-is 是 判断类型是否与预测的类型一样,是,返回True;不是,返回False
-isnot 不是 判断类型是否与预测的类型不一样,是,返回Ture;不是,返回False
-as 当作 试图转换类型,成功,返回该转换后的对象;若失败,返回$null
#>
$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 = @{ } # 创建空哈希表
$dict = @{ Name = "@莫名的墨迹",Age = $null }
#>
$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