PowerShell语法(1)
程序员文章站
2023-12-30 19:37:46
...
变量
定义与赋值
Posh 不需要显式声明变量类型,只须记住变量的前缀为$,单引号中的字符串不会识别和处理变量名,变量名大小写不敏感,还有一种用法则是用花括号把整个变量名括起来。赋值操作符为“=”,可以把任何数据赋值给一个变量,甚至一条cmdlet命令 。
Posh> ${"I"like $}="mossfly"
Posh> $a=$b=$c=123 #同时给多个变量赋相同的值
Posh> $value1,$value2=$value2,$value1 #交换两个变量的值
变量相关命令
- 查看已定义的正在使用的变量
ls variable:
- 查找变量 如查找以value打头的变量名
ls variable:value*
- 验证变量是否存在
Test-Path variable:value1
返回bool值 - 删除变量
del variable:value1
- 变量专用命令 Clear-Variable,Remove-Variable,Set-Variable,Get-Variable,New-Variable(因为虚拟驱动器variable:的存在,Clear,Remove,Set打头的命令可以被代替,但是Get-Variable,New-Variable非常有用,New-Variable可以在定义变量时,指定变量的一些其它属性,比如访问权限)
New-Variable的用法列举
- 变量写保护
New-Variable num -Value 100 -Force -Option readonly
在创建变量时,给变量加上只读属性,但是仍可通过强制删除变量,再重新创建变量更新变量内容del Variable:num -Force
- 创建常量
new-variable num -Value "strong" -Option constant
常量一旦声明,不可修改 - 变量描述
new-variable name -Value "me" -Description "This is my name"
通过Format-List 查看描述ls Variable:name | fl *
子表达式变量
在字符串中,子表达式变量会先计算括号内表达式,把表达式的值返回用于字符串。
Posh> $a=1 #普通变量
Posh> "val is $a"
val is 1
Posh> "val is $(3+6)" #子表达式变量
val is 9
Posh> "The size of Powershell_Cmdlets.html is $($(ls Powershell_Cmdlets.html).Length)"
The size of Powershell_Cmdlets.html is 735892
环境变量
基本变量只存在于内部会话中,一旦shell关闭,这些变量就会自动消失。但是环境变量被更新,则会继续保存在操作系统中,其它程序也可以调用。基本变量存在variable:虚拟驱动,环境变量存在env:虚拟驱动,利用$env:
去环境变量env:驱动器中读取变量。
- 查找环境变量
ls env:
- 创建新的环境变量
$env:TestVar1="This is my environment variable"
- 删除变量
del env:windir
- 更新变量 即为环境变量重新赋值
直接操作变量是否存在安全问题?不存在,$env:中的环境变量只是机器环境变量的一个副本,更改在下一次重新开启shell时,会恢复如初(.NET方法更新环境变量除外)
直接更改环境变量只会影响当前会话,不会更新在机器上,如下
Posh> md .myscript
Directory:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2011/11/29 18:20 myscript
Posh> cd .myscript
Poshmyscript> "write-host 'Hollow , Powershell'" > hollow.ps1
Poshmyscript> .hollow.ps1
Hollow , Powershell
Posh myscript> cd ..
Posh> $env:Path+=";C:PowerShellmyscript"
Posh> hollow.ps1
Hollow , Powershell
Posh> hollow
Hollow , Powershell
.NET方法更改环境变量会影响机器, User 指当前用户,如下
Posh> [environment]::SetEnvironmentvariable("Path", ";c:\powershellscript", "User")
Posh> [environment]::GetEnvironmentvariable("Path", "User")
;c:\powershellscript
驱动器变量
Posh中所有不是我们自己的定义的变量都属于驱动器变量,它的前缀提供给我们一个可以访问信息的虚拟驱动器,利用$变量化后进行访问。
- 查看驱动器
Get-PSdrive
- 访问物理驱动文件路径
${c:/powershell/ping.bat}
- 环境变量替换文件路径
Posh> #$后花括号中的路径必须是具体的路径 使用${$env:HOMEDRIVE/Powershellping.bat}不能被识别
Posh> #反引号放在$前 会把$解析成普通字符 解释器会继续去解析第二个$,发现env:HOMEDRIVE 将其替换成C 到此 Invoke-Expression的参数就变成了${C:/Powershell/ping.bat}
Posh> Invoke-Expression "`${$env:HOMEDRIVE/Powershell/ping.bat}"
变量作用域
Posh支持全局、当前、私有和脚本四个作用域。它会针对每个函数和脚本给它们分配不同的作用域。
- 更改变量的可见性,禁用作用域限制
Posh> . .\test.ps1
在运行脚本时使用一个圆点和空格,解释器就不会为脚本本身创建作用域,而会共享当前控制台的作用域。 - 设置单个变量的作用域
private修饰符可以把当前控制台中的变量保护起来,不让它在函数和脚本中被访问;private修饰的变量不可以在函数中通过$global修改,但local修饰的变量可以。
Posh> $logo="www.pstips.net" #$local默认变量,可以省略修饰符,在当前作用域有效,其它作用域只对它有只读权限
Posh> $private:logo #私有变量,只会在当前作用域有效,不能贯穿到其他作用域
www.pstips.net
Posh> $script:logo #脚本变量,只会在脚本内部有效,包括脚本中的函数,一旦脚本运行结束,这个变量就会被回收
www.pstips.net
Posh> $global:logo #全局变量,在所有的作用域中有效,如果你在脚本或者函数中设置了全局变量,即使脚本和函数都运行结束,这个变量也任然有效
www.pstips.net
变量的类型和强类型
- 查看类型信息
(var).gettype().name
- 指定类型语法定义变量
[byte]$b=101
使用该语法则不可以给变量赋与类型定义域不匹配的值 - 使用指定类型语法的优点 每个特殊的数据类型都有自己的特殊命令和特殊方法
比如把一个日期字符串赋给一个变量,Posh不会自动把字符串转换成日期对象,若在赋值时指定DateTime类型时,则所有的.Net 中DateTime类型的方法都可使用 - 可用类型
整数:[int],[int16],[int32],[int64],[long],[uint16],[uint32],[uint64]
浮点数:[float],[single],[double]
文本:[char],[string],[ XML ],[regex]
字节:[byte],[sbyte]
其他:[array],[bool],[datetime],[decimal],[guid],[hashtable],[nullable],[psobject],[scriptblock],[switch],[timespan],[type]
数组
命令返回数组
Posh会把命令返回的文本按行作为元素存为数组。当命令的返回值不止一个结果时,也会自动把结果存储为数组。
- 判断是否为数组
$ar -is [array]
- 使用管道进一步处理结果数组
ipconfig | Select-String "IP"
- 数组元素为对象
Posh> $result=ls #result数组中元素为对象
Posh> $result[0].gettype().fullname #查看对象所属
System.IO.DirectoryInfo
Posh> $result[0] | fl * #使用Format-List * 查看属性和方法
创建数组
- 逗号间隔
$num=1,2,3,4,5
- range数组
$num=1..5
- 空数组
[email protected]()
- 单元素数组 `$ar=,"one"
- 数组多态 在弱类型数组中可以存储不同类型的值
访问数组
- 索引寻址
$num[0]
$num[-1..-2]
- 选择多个元素并按索引顺序输出
$num[0,2,1]
- 逆序输出
$num[($num.Count)..0]
- 添加元素
$num+=6
- 删除元素
$num=$num[0..1]+$num[3]
复制数组
- 赋值运算符 复制引用,两个变量共享同一份数据
- Clone() 方法
$ar=$arr.Clone()
复制数据 - Equals()方法 判断两个数组变量是否具有同一引用
强类型数组
统一限制所有元素的类型,[int[]][email protected]()
,如果目标数据类型不能转换成功,就会抛出异常
字典(哈希表)
- @{}(分号间隔)创建
[email protected]{ Name = "小明";Age="12";sex="男" }
- 元素包含数组
[email protected]{ Name = "小明";Age="12";sex="男";Books="三国演义","围城","哈姆雷特" }
- 插入键值对
$stu.nKey="newValue"
- 更新键值对
$stu.oKey="newValue"
- 删除键值对
$stu.Remove("oKey")
- 利用字典格式化输出
@{Expression:绑定的表达式 Width:列宽度 Label:列标题Alignment:列的对齐方式
Posh> $column1 = @{expression="Name"; width=30;label="filename"; alignment="left"}
Posh> $column2 = @{expression="LastWriteTime"; width=40;label="lastModifying"; alignment="right"}
Posh> ls | Format-Table $column1, $column2
对象
创建对象
Posh> $ob=New-Object object #创建空对象
Posh> Add-Member -InputObject $ob -MemberType Noteproperty -Name attr1 -Value "first attribute"
Posh> $ob | Add-Member Noteproperty attr2 "second attribute" #添加属性
Posh> #------------------
Posh> Add-Member -InputObject $ob -MemberType ScriptMethod -Name meth1 -Value {"first method"}
Posh> $ob | Add-Member ScriptMethod meth2 {"second method"} #添加方法
MemberType有:
- Property 普通属性
- AliasProperty 属性别名
- NoteProperty 随后增加的属性
- CodeProperty 通过静态.Net方法返回属性的内容
- ScriptProperty 通过脚本执行返回一个属性的值
- ParameterizedProperty 需要传递参数的属性
- Method 普通方法
- CodeMethod 映射到静态的.NET方法
- ScriptMethod 一个执行Powershell脚本的方法
属性和方法
- 属性和方法都是对象的成员,使用Get-Member返回对象成员的详细信息,如果只显示属性设置参数 memberType 为“Property”
$ob | Get-Member -memberType property
- 标准方法 所有对象共有的方法
Equals() 比较对象是否相同
GetHashCode() 返回对象的数字格式码
GetType() 返回对象的数据类型
ToString() 将对象转换成可读的字符串 - 静态方法
通过方括号和类型名称得到类型对象本身,然后通过Get-Memeber命令查看该类型支持的静态方法[System.DateTime] | Get-Member -static -memberType *Method