标点符号

PowerShell命令中包含了大量的标点符号,并且大部分的标点符号在帮助文档和PowerShell中具有不同的含义。
下面是一些标点符号在PowerShell中的含义:

  • ```(重音符)PowerShell中的转义字符。它会移除紧跟在重音符之后字符串中包含的特殊含义。
    • 例如,将该空格符转义,cd C:\Program Files`,会将该空格的作用去除,仅将该符号作为文字中的一部分。
  • ~(波浪符)作为路径一部分时,该字符表示当前用户的根目录,即系统变量UserProfile中定义的值。
  • ()有两种使用场景:
    • 1)和在数学中一样,括号定义了执行的顺序。PowerShell会优先执行括号中的命令。如果存在多重括号,则会从最里层括号向外执行。通过这种方式,可以很轻易实现:先执行一个命令,之后将该命令的输出结果传递给另外一个命令的某个参数,比如Get-Service –ComputerName (Get-Content C:\ComputerNames.txt)
    • 2)括号也可以被用作包含一个方法的参数。即使该方法不要求使用任何参数,也必须带有括号,比如Change-Start-Mode('Audomatic')以及Delete()
  • []在PowerShell中有两种使用方式:
    • 1)需要访问一个数组或者集合中某个单独的对象时,可以使用中括号来指定对应的索引号:$Services[2]表示从$Services中获取第三个对象。
    • 2)当需要将某个数据转化为特定的类型时,需要将类型包含在中括号中。例如,$MyResult/3 -as [INT]会将除法运算的结果转化为整数;再比如,命令[XML]$Data=Get-Content Data.XML会读取Data.XML中的内容,并且尝试将该内容解析为合法的XML文件。
  • {}花括号有3种用途:
    • 1)花括号可用作包含可执行代码或者命令块,我们称之为脚本段(Script Blocks)。该脚本段经常被作为值传递给那些可接受脚本段或者筛选块的参数:Get-Service | Where-Object {$_.Status –eq 'Running'}
    • 2)花括号可用作包含构成哈希表的键-值对。左大括号前面总是一个“@”符号。在下面的示例中,我们使用花括号来包含哈希表的键-值对(在示例中,有两组键-值)。第二个花括号包含一段表达式的脚本段,该脚本段作为第二个键的值:$HashTable= @{l='Label';e={expression}}
    • 3)当变量的名称中包含空格或其他非法字符时,必须用花括号来包裹这部分信息${My Variable}
  • ' '可用作包含字符串(String)。PowerShell并不会对包含在单引号中的字符串,查找转义字符或变量。
  • " "也可用作包含字符串,但与单引号不同的是,PowerShell会针对双引号中的字符串数据进行查找转义字符以及$字符。
    • 其中会进行针对转义字符的处理,同时$符号后面带有的字符(到下一个空格为止)会被识别为一个变量名字,并且其值会被替换掉。
    • 例如,如果变量$One的值为“World”,同时定义$Two="Hello $Onen”,那么$Two的值就会是“HelloWorld”之后再加一个回车(n代表一个回车键)。
  • $告诉PowerShell $后面的字符(截止到下一个空格处)为一个变量的名称。但是当在使用管理变量的Cmdlet时,可能容易造成误解。
    • 假如$One变量的值为Two,然后执行New-Variable –Name $One –Value 'Hello'命令,会创建一个名称为Two的变量,并且其值为“Hello”——有些人感到很奇怪,为什么变量的名称会是Two。这是因为$符号告诉PowerShell使用$One的值作为新变量的名称。相对应地,New-Variable –Name One –Value 'Hello',该命令会创建一个名为One的变量。
  • %是ForEach-Object Cmdlet的别名,同时它也是模运算符,返回除法运算后的余数。
  • ?是Where-Object Cmdlet的别名。
  • >(右尖括号)类似Out-File Cmdlet的一个别名。但是严格来讲,它并不是一个真正的别名,但却提供了Cmd.exe风格式的文件重定向功能:Dir > Files.Txt
  • +、-、*、/、% 这些数学运算符是作为标准算术运算符使用。请注意,+也可以用作拼接字符串。
  • -(破折号或者叫连字符)可以用作连接参数名称或者其他运算符,如-ComputerName或者-Eq。
  • @(at符号)在PowerShell中有四种用途:
    • 1)可用在哈希表的左花括号之前。
    • 2)当用在括号之前时,其后会紧跟一串以逗号分隔的值,这些值组成一个数组:$Array= @(1,2,3,4)。其中的@字符与括号是可选的,这是由于PowerShell默认会将以逗号分隔的列表识别为数组。
    • 3)可以表示一个Here-String。Here-String是指包含在单引号或者双引号中的字符串。一个Here-String以“@”字符作为开始和结束的标志,结束的“@”必须位于另起一行的起始位置。具体可执行Help About_Quoting_Rules。另外需要说明的是,Here-String也可通过单引号进行定义。
    • 4)@也是PowerShell中的传递符(Splat Operator)。如果构建了一个哈希表,在哈希表中,键名称能匹配参数名称,并且键的值为参数的值,那么你就可以将该哈希表传递给一个Cmdlet。Don曾经为TechNet Magazine写过一篇关于传递(Splating)的文章(https://technet.microsoft.com/en-us/magazine/gg675931.aspx)。
  • &(与符号)是PowerShell中的一个调用运算符,使得PowerShell可以将某些字符识别为命令,并运行这些命令。例如,$a=”Dir”命令将“Dir”赋给了变量$a,然后&$a就会执行Dir命令。
  • ;(分号)一般用作分隔PowerShell中同一行的两个命令:Dir ; Get-Process。这个命令会先执行Dir命令,之后执行Get-Process命令。它们的执行结果会发送给一个管道,但是Dir命令的执行结果并不会通过管道发送给Get-Process命令。
  • #为注释符号。跟在#之后的文字,到下一个回车之前,均会被PowerShell忽略掉。
    • <>可以被用作定义一个注释块的标签,“<#”作为起始,“#>”作为结束。包含在该注释块中的所有命令均会被PowerShell忽略掉。
  • =是PowerShell中的赋值运算符,用来给一个变量赋值:$One=1。该运算符可以与数学运算符结合使用:$Var +=5。该命令会对$Var变量的值增加5。
  • |(管道符)主要用于将一个Cmdlet的输出结果传递给另外一个Cmdlet。第二个Cmdlet(接收输出结果的Cmdlet)采用管道参数绑定方法来确定哪个参数或者哪些参数来负责接收传入的管道对象。
  • \(反斜杠)或者/(正斜杠)可以作为数学表示中的除法运算符;
    • 反斜杠和正斜杠也可以作为文件路径中的分隔符:C:\Windows和C:/Windows路径一致。反斜杠在WMI筛选场景以及正则表达式中也可作为转义字符。
  • .(句号)有三种用途:
    • 1)句号可以被用作表示希望访问某个成员,比如一个属性或方法;再或者一个对象:$_.Status表示访问$_占位符中对象的Status属性。
    • 2)它可以通过“.”引用源码从而执行一段脚本,意味着该脚本运行在当前作用域下,并且该脚本定义的任何对象在脚本运行完毕之后均存在,比如. C:\myscript.ps1
    • 3)两个“.”(..)会形成一个范围运算符。“..”也可用作表示文件系统中的当前路径的父文件夹,比如..\
  • ,(逗号)用在引号之外时,可以用作分隔数组或者列表中的项:"One", 2, "Three",4。另外,它也可用作将多个静态值传递给可接收这些值的参数:Get-Process –ComputerName Server1, Server2, Server3
  • ::可用作访问类的静态成员。这里采用了.NetFramework编程语言的概念,比如[-DateTime]::Now(其实也可以使用Get-Date来获取相同的结果)。
  • !(感叹号)是“非”(Not)布尔运算符的别名。

    运算符

    PowerShell不会使用其他编程语言使用的常规比较运算符,而是使用下列运算符。

  • -eq:等于(-ceq用作字符串比较,包括大小写是否一致)。

  • -ne:不等于(-cne用作字符串比较,包括大小写是否一致)。
  • -ge:大于或等于(-cge用作字符串比较,包括大小写是否一致)。
  • -le:小于或等于(-cle用作字符串比较,包括大小写是否一致)。
  • -gt:大于(-cgt用作字符串比较,包括大小写是否一致)。
  • -lt:小于(-clt用作字符串比较,包括大小写是否一致)。
  • -contains:若数据集包含特定对象,则返回真(True)。
    • $Collection –Contains $Object
    • -nocontains表示相反含义。
  • -in:若特定对象包含在数据集中,则返回真(True)。
    • $Object –in $Collection
    • -noin表示相反含义。

逻辑运算符可用于组合运算:

  • -not:将真假值取反(!是该运算符的别名)。
  • -and:如果整个表达式要为真,则所有子表达式均需要为真。
  • -or:如果整个表达式要为真,则其中一个子表达式需要为真。

另外,还存在执行特定操作的运算符:

  • -join:将一个数组的元素连接为分隔的字符串。
  • -split:将一个分隔的字符串分离为一个数组。
  • -replace:将一个字符串中特定字符(串)替换为另外的字符(串)。
  • -is:若一个对象为指定类型,返回为真(True)。
    • $ID –is [INT]
  • -as:将对象转化为特定类型
    • $ID –As [INT]
  • ..:一个范围运算符,1..10会返回1到10的十个对象。
  • -f:格式化运算符,会使用后面提供的值替换对应的占位符。
    • "{0}, {1}" –f "Hello","World"

      自定义属性与自定义列的语法

      先前已经了解,可以使用Select-Object来定义自定义属性,或者分别使用Format-Table以及Format-List自定义列或列表条目。
      下面是对应的哈希表语法:
      image.png
      image.png
      在表达式中,可以使用$_占位符关联到当前对象。
      image.png
      Select-Object和Format-的Cmdlet均会查找n(或者name或者label或者l)键和e键;Format-Cmdlet也支持Width和Align(仅支持Format-Table)和FormatString操作。