欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

上一篇:

下一篇: