Windows PowerShell 语言快速参考

 

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

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

示例
$g = Get-WmiObject Win32_Process

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

 

算术二元运算符

+

加法,串联

-

减法

*

乘法,字符串重复

/

除法

%

 

 

数组操作

此数组中是否包含 3

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

 

数组

“a”,“b”,”c”

字符串数组

1,2,3

整数数组

@()

空数组

@(2)

1 个元素的数组

1,(2,3),4

数组包含数组

,”hi”

一个元素的数组

$a[5]

数组的第六个元素*

$a[2][3]

数组的第四个或第三个

 

元素

$a[2..20]

返回从第 3 个元素到第 21 个元素

数组从零开始。

 

赋值运算符

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

 

 

关联数组(哈希表)

$hash = @{ }

创建空哈希表

$h =@{foo=1;bar=2}

创建并初始化哈希表

$hash.key1 = 1

1 赋予键“key1

$hash.key1

返回 key1 的值

$hash["key1"]

返回 key1 的值

 

布尔值和运算符

TRUE

FALSE

$TRUE

$FALSE

所有长度大于 0 的字符串(单词“false”除外)

空字符串或字符串“false

所有不等于 0 的数字

所有等于 0 的数字

长度大于 1 的数组

长度为 0 的数组

长度为 1,其元素为 TRUE 的数组

长度为 1,其元素为 FALSE 的数组

对所有对象的引用

空值

 

Break(脚本)

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

示例:

while (1)

{               $a = something

if ($a –eq 1) break;

}

 

命令扩展运算符

$( )

返回空值

$(1,2,3)

返回包含 123 的数组。

$(Get-Alias a*)

返回表达式的计算结果

@(Get-Alias;Get-Process)

执行其中的两条命令,然后在数组中返回结果

 

注释

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

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

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

Write-Host Hello#world

 

比较运算符

-eq

等于

-ne

不等于

-gt –ge

大于,大于或等于

-lt –le

小于,小于或等于

 

可以在运算符前加上“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 转义字符为倒撇号,即 `。若要将字符设置为文本格式,请在其前加上 `。若要指定 `,请使用 ``

特殊转义序列

`0

(空值)

`a

(警报)

`b

(退格)

`f

(换页)

`n

(新行)

`r

(回车)

`t

(制表符)

`v

(垂直引号)

 

 

执行顺序

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 自动变量(未全部列出)

$$

前一命令行的最后一个标记

$?

上一命令的布尔状态

$^

前一命令行的第一个标记

$_

当前管道对象

$Args

为脚本或函数指定的参数

$Error

先前命令中的错误数组

$Foreach

引用 foreach 循环中的枚举器

$Home

用户的主目录;通常设置为 %HOMEDRIVE%"%HOMEPATH%

$Host

引用宿主 POWERSHELL 语言的应用程序

$Input

通过管道传递给脚本的对象的枚举器

$LastExitCode

上一程序或脚本的退出代码

$Matches

使用 –match 运算符找到的匹配项的哈希表

$PSHome

Windows PowerShell 的安装位置

$profile

标准配置文件(可能不存在)

$StackTrace

Windows PowerShell 捕获的上一异常

$Switch

switch 语句中的枚举器

 

对象属性

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

$a = Get-Date

$a.Date

$a.TimeOfDay.Hours

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

[DateTime]::Now

 

 

运算符优先级

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

 

 

其他运算符

 

,

数组构造函数

..

范围运算符

-contains

 

-is

类型鉴别器

-as

类型转换器

-band

二进制与

-bor

二进制或

-bnot

二进制非

 

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”,其中可包含任意字符(包括回车和引号)。将计算表达式 $(2+2)

”@

@’

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

 

字符串运算符

+

连接两个字符串

*

按特定次数重复字符串

-f

设置字符串格式(.NET 格式说明符)

-replace

替换运算符
"abcd" –replace “bc”, “TEST”

aTESTd

-match

正则表达式匹配

-like

通配符匹配

 

 

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 符)或 .(点)后跟空格或字母开头,则将以命令模式进行分析。

2+2

以数字开头为表达式模式。

"text"

以引号开头为表达式模式。

text

以字母开头为命令模式。

& "text"

and 符开头为命令模式。

. "file.ps1"

以点后跟空格开头为命令模式。

.125

以点后跟数字(而不是空格或字母)开头为表达式模式。

.text

以作为命令名称“.text”的一部分的点开头为命令模式

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

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 点起(条件)已过多长时间。

 

 

posted @ 2009-05-17 17:54  ahuo  阅读(728)  评论(0编辑  收藏  举报