为不同类型的系统提供的本机支持

Windows PowerShell 对 WMI、XML、ASDI、ADO 和 COM 对象进行了改编以提供通用语法来访问其属性和方法。

示例
$g = Get-WmiObject Win32_Process

$g[0].Name # instead of $g[0].Properties[“Name”]

 

算术二元运算符

 

数组操作

此数组中是否包含

1,2,3,5,3,2 –contains 3

返回所有等于 3 的元素:

1,2,3,5,3,2 –eq 3

 

返回所有小于 3 的元素:

1,2,3,5,3,2 –lt 3

 

测试 2 是否存在于集合中:

if (1, 3, 5 –contains 2)

其他运算符:-gt、-le、-ge、-ne

 

数组

数组从零开始。

 

赋值运算符

=, +=, -=, *=, /=, %=

 

 

关联数组(哈希表)

 

布尔值和运算符

 

Break(脚本)

break 命令用于退出循环。它可以接收要退出到的可选

示例:

while (1)

{               $a = something

if ($a –eq 1) break;

}

 

命令扩展运算符

 

注释

# 这是注释,因为 # 是第一个标记字符

$a = “#这不是注释…”

$a = “something” # …但这个 # 号后是注释。

Write-Host Hello#world

 

比较运算符

 

可以在运算符前加上“i”或“c”以指定不区分大小写或区分大小写的操作(例如,–ceq)

Continue(脚本)

continue 语句表示继续执行循环的下一次迭代,而不退出循环。示例:

while (1)

{               $a = something

       if ($a –eq 1) (continue)

除非 $a 等于 1,否则将不会执行此行。

}

# 永远不会执行此行。

Dot Sourcing

Dot sourcing 允许在当前作用域(而不是本地作用域)中运行函数、脚本块和脚本。示例:

. MyFunction

 

如果 MyFunction 设置了变量,则该变量是针对当前作用域(而不是该函数的本地作用域)设置的。

$a = {$x = Get-Process | Select –First 2}

. $a    #在当前作用域中计算脚本块

 

转义序列

 

执行顺序

Windows PowerShell 尝试按以下顺序解析命令:别名、函数、cmdlet、脚本、可执行文件和正常文件。

 

For(脚本)

[:label] for ([初始值]; [条件]; [迭代值]) {}

 

示例:

for ($i = 0; $i –lt 5; $i++) {Write-Object $i}

 

Foreach(脚本)

[:label]

foreach (集合中的标识符) {}

Expression | foreach {}

Expression | foreach {BEGIN{} PROCESS{} END{}}

 

示例:

$i = 1,2,3

foreach ($z in $i) {Write-Object $z}

Get-Process |foreach {BEGIN{$x=1}

PROCESS{$X++}

END{“$X Processes”}}

 

Function(脚本)

function MyFunction {

       write-object $args[0]

}

 

function test ([string]$label=”default label”,[int]$start=0)

{ BEGIN {$x=$start} PROCESS {¡?label:$_’; $x++}

END{“$x total”}

}

Filter(脚本)

Filter 是编写带有 PROCESS 脚本块的函数的速记方式。

filter MyFilter {

       $_.name

}

If/elseif/else(脚本)

if (condition) {…}

elseif (condition) {…}

else {…}

 

在命令行中,右大括号必须与 elseif 和 else 同行。此限制不适用于脚本。

调用运算符

& 运算符可用于调用脚本块或命令/函数的名称。

示例:

$a = “Get-Process”

&$a

$a = { Get-Process | Select -First 2 }

&$a

 

逻辑运算符

!、-not、-and、-or

 

方法调用

可以针对对象调用方法。示例:

$a = “这是字符串”

$a.ToUpper()

$a.SubString(0,3)

$a.SubString(0,($a.length/2))

$a.Substring(($a.length/2), ($a.length/3))

 

使用“::”运算符可以调用静态方法

[DateTime]::IsLeapYear(2005)

 

Windows PowerShell 自动变量(未全部列出)

 

对象属性

使用“.”运算符可以直接引用对象的属性。

$a = Get-Date

$a.Date

$a.TimeOfDay.Hours

使用“::”运算符可以引用静态属性

[DateTime]::Now

 

 

运算符优先级

在 Windows PowerShell 中,运算符是按照以下优先顺序进行计算的:() {}、@ $、!、[ ]、.、&、++ --、一元 + -、* / %、二元 + -、比较运算符、-and –or、|、> >>、=

 

 

其他运算符

 

 

Return(脚本)

return 命令用于退出当前脚本或函数并返回值。

示例:

function foo {

       return 1

}

 

Scopes(脚本)

在不同的作用域中可以将变量和其他数据元素实例化:

全局作用域中的变量对所有作用域均可见。

脚本作用域中的变量只对该脚本文件中的所有作用域可见。

本地作用域中的变量仅在当前作用域及其子域中可见。

私有作用域变量仅对当前作用域可见。

作用域是在外壳程序函数的函数体中创建的(请参阅函数创建)

 

示例:

$global:a = 4

$script:a = 5

$local:a = 3

$private:a = 6

 

 

脚本块

命令和表达式可存储于脚本块以供以后执行。

示例:

 

$block = {Get-Process; $a=1}

&$block

脚本

Windows PowerShell 命令可存储于脚本文件中,并可从其中执行。Windows PowerShell 脚本的文件扩展名为“.ps1”。参数可传递给脚本,而脚本可返回值。

示例:

$sum = MyAdder.ps1 1 2 3

 

字符串

字符串常量:

“这是字符串,此 $variable 可展开为 $(2+2)”

‘这是字符串,此 $variable 不能展开’

@”

这是“here string”,其中可包含任意字符(包括回车和引号)。将计算表达式

”@

@’

带单引号的“here string”不计算表达式。

 

 

 

Switch(脚本)

在该脚本中可以使用变量 $_。$_ 表示当前正在计算的值。如果在 switch 中使用了数组,则将测试该数组的所有元素。

示例:

$var = "word1","word2","word3"

switch -regex ($var) {

"word1" {"Multi-match Exact " + $_ }

"word2" {"Multi-match Exact " + $_ }

"w.*2"   {"Pattern match Exact " + $_ }

default {"Multi-match Default " + $_ }

}

 

输出:

Multi-match Exact word1

Multi-match Exact word2

Pattern match Exact word2

Multi-match Default word3

 

Throw

Throw 为脚本提供的功能等同于 ThrowTerminatingError API 为 cmdlet 提供的功能。

throw "Danger, Danger"

Danger, Danger

所在行:1 字符:6

+ throw <<<< "Danger, Danger"

Throw 接受字符串、异常或 ErrorRecord 作为参数。

 

Trap

Trap [ExceptionType] {

if (…)

{    continue

# 从导致 trap 的脚本语句之后的下一语句继续;

# $? 将更新,但不生成任何错误记录

} else (…)

{      Break  

# 再次引发异常

}

# 不执行 $ErrorActionPreference 设置中

# 指定的任何操作

}

 

 

类型操作(脚本)

 

-is   IS 类型(例如,$a -is [int])

-as   转换为类型(例如 1 -as [string] 将 1 作为字符串处理)

 

Until(脚本)

 

do

{

} until (condition)

 

 

变量

格式:

$[scope:]名称 或 ${任何名称} or ${任何路径}

 

示例:

$a = 1

${!@#$%^&*()}=3

$global:a = 1 # 在所有位置可见

$local:a = 1     # 在此作用域中定义且对子作用域可见

$private:a=1    # 与本地作用域相同,但对子作用域不可见

$script:a=1     # 对此脚本中的所有作用域均可见

$env:path = “d:"windows”

${C:"TEMP"testfile.txt}=”这将写入文件”

Get-Variable –scope 1 a #从父作用域获取值

Get-Variable –scope 2 a # 祖父

 

 

While(脚本)

[:label] while (condition)

}

 

do

{

} while (condition)

 

 

 

分析

Windows PowerShell 可以按两种模式进行分析 -- 命令模式和表达式模式。在表达式模式下,Windows PowerShell 以最高级别语言分析方法来进行分析:若为数字,则原样表示该数字;若为字符串,则需要加引号,依此类推。表达式的表示方法如下所示:

2+2

4

"Hello" + " world"

Hello world

$a = "hi"

$a.length * 13

26

在命令模式下进行分析时,字符串不需要加引号,除变量和圆括号中的内容外的所有内容均可看作字符串。例如:

copy users.txt accounts.txt     

可将 users.txt 和 accounts.txt 视为字符串

write-host 2+2           

可将 2+2 视为字符串,而不是要计算结果的表达式

copy $src $dest          

$src 和 $dest 是变量。从长远的角度来看,如果在命令外壳程序中工作时不需要使用引号,则大有裨益,因为这大大减少了所需的键入量。

分析模式是由遇到的第一个标记确定的。如果该标记为数字、变量或由引号括起的字符串,则外壳程序以表达式模式进行分析。如果该行以字母、&(and 符)或 .(点)后跟空格或字母开头,则将以命令模式进行分析。

将表达式和命令混合使用是非常有用的;使用圆括号即可实现这一点。模式发现过程从圆括号内开始。

Write-Host (2+2)

将 2+2 视为要计算结果的表达式,传递给 Write-Host 命令。

(Get-Date).day + 2

将 Get-Date 视为命令,其执行结果将成为该表达式左边的值。

您可以不受限制地嵌套命令和表达式。

Write-Host ((Get-Date).day + 2)

Get-Date 是命令。((Get-Date).day+2) 是表达式,而 Write-Host ((Get-Date).day + 2) 也是命令。

Write-Host ((Get-Date) - (Get-Date).date)

两次使用 Get-Date 命令以确定自午夜 12 点起(条件)已过多长时间。

 

+

加法,串联

-

减法

*

乘法,字符串重复

/

除法

%