winexec函数 执行powershell 脚本_PowerShell 语法入门之变量

311c05c4636342d0446d8ccd2baf0aac.png

PowerShell 语法

在学习语法之前,我们首先必需务必要搞懂几个问题:PowerShell是什么类型的语言,是强类型还是弱类型,是静态的还是动态的?把语言的性质弄清楚,再开始学习语法;有助于我们更好地深入理解。无论学习什么编程语言,了解它是什么类型才是学习其语法的第一步;也是深入学习其精髓所在,更好地区别于其它编程语言。

powershell 是一门强类型语言吗?(与Stack OverFlow相仿的网站,支持中文搜索)

PowerShell 是一门强类型语言吗?(Stack OverFlow)

PowerShell 是什么语言?(StackOverFlow)

综合以上内容,可得出PowerShell实际上是一门动态的弱类型脚本解释语言。
$a = "PowerShell" # 声明变量a并赋值,用$美元符号标识 
$a.GetType() # 获取变量a的数据类型 String:字符串
$local:b # 声明局部变量
$glocal:b = 12 # 定义全局变量
……
# 脚本变量和私有变量,如法炮制(同上)

7ef3d718a9c9a48d897e83bf5131382e.png
代码演示效果,所用PowerShell版本为5.1

变量修饰符

$local ---- 局部变量
  • 局部变量,作用范围:变量将只在局部范围内创建。这是未指定范围的变量的默认值。Localvariables可以从源自currentscope的作用域读取,但是不能修改它们
$script ---- 脚本变量
  • 脚本变量,作用范围:该变量仅在脚本中有效,但在脚本中的所有位置均有效。因此,脚本中的函数可以处理其他变量,而这些变量在脚本中定义时不在函数内。
$global ---- 全局变量
  • 全局变量,作用范围:这个变量在任何地方都是有效的,即使是在函数和脚本之外。
$private ---- 私有变量
  • 私有变量,作用范围:该变量将仅在当前作用域中创建,而不会传递到其他作用域。 因此,它只能在当前范围内读写

c80beb15f79f05122732af6c4c9a5c37.png
代码演示效果,所用PowerShell版本为5.1,若有不同,请升级版本

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值