Windows PowerShell 入门指南

更新时间:2023-04-19 20:16:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Windows PowerShell 入门指南

Windows PowerShell 是专为系统管理员设计的新Windows 命令shell。Windows PowerShell 包括交互式提示和脚本环境,两者既可以独立使用也可以组合使用。

与接受和返回文本的大多数shell 不同,Windows PowerShell 是在.NET Framework 公共语言运行时(CLR) 和.NET Framework 的基础上构建的,它接受和返回.NET Framework 对象。环境中的这一根本更改带来了管理和配置Windows 的全新工具和方法。

Windows PowerShell 引入了cmdlet(读作“command-let”)的概念,这是内置到shell 中的一个简单的单一功能命令行工具。可以分别使用每个cmdlet,但是组合使用这些简单的工具执行复杂任务时才发挥其作用。Windows PowerShell 包括一百多个基本的核心cmdlet,您可以编写自己的cmdlet 并与其他用户共享它们。

与许多shell 一样,Windows PowerShell 为您提供了对计算机上文件系统的访问。此外,使用Windows PowerShell 提供程序还可以访问其他数据存储,如注册表和数字签名证书存储,就像访问文件系统一样容易。

本入门指南对Windows PowerShell 进行了以下几方面介绍:语言、cmdlet、提供程序以及对象用法。

Windows PowerShell 用户指南

Windows PowerShell 是一种命令行shell 和脚本环境,使命令行用户和脚本编写者可以利用.NET Framework 的强大功能。它引入了许多非常有用的新概念,从而进一步扩展了您在Windows 命令提示符和Windows Script Host 环境中获得的知识和创建的脚本。

目标受众

《Windows PowerShell 用户指南》主要面向之前没有Windows PowerShell 背景知识的IT 专业人员、程序员和高级用户。虽然具备脚本和Windows Management Instrumentation (WMI) 方面的背景知识会有所帮助,但是理解本文档并不假定或要求您具备此方面知识。

Windows PowerShell About 帮助主题

about_Aliases

主题

about_aliases

简短说明

说明如何在Windows PowerShell 中使用cmdlet 和命令的替代名称。

详细说明

别名是cmdlet 或命令元素(如函数、脚本、文件或可执行文件)的替代名称或昵称。可以在任何

Windows PowerShell 命令中使用别名代替命令名称。

要创建别名,请使用New-Alias cmdlet。例如,下面的命令为Get-AuthenticodeSignature cmdlet 创建别名"gas":

new-alias -name gas -valueGet-AuthenticodeSignature

为cmdlet 名称创建别名后,可使用别名代替cmdlet 名称。例如,若要获取SqlScript.ps1 文

件的Authenticode 签名,请键入:

get-authenticodesignature sqlscript.ps1

或键入:

gas sqlscript.ps1

如果创建"word"作为Microsoft Office Word 的别名,则可以键入"word"替代下面的内容:

"c:\program files\Microsoft Office\office11\winword.exe"

内置别名

Windows PowerShell 包含一组内置别名,其中包括用于Set-Location cmdlet 的"cd"和"chdir",以及用于Get-ChildItem cmdlet 的"ls"和"dir"。

要获取计算机上的所有别名(包括内置别名),请键入:

get-alias

别名CMDLET

Windows PowerShell 包含以下用于处理别名的cmdlet:

- Get-Alias. 获取当前会话中的所有别名。

- New-Alias. 创建新别名。

- Set-Alias. 创建或更改别名。

- Export-Alias. 将一个或多个别名导出到文件中。

- Import-Alias. 将别名文件导入到Windows PowerShell 中。

有关cmdlet 的详细信息,请键入:

get-help -detailed

例如,键入:

get-help export-alias -detailed

创建别名

要创建新别名,请使用New-Alias cmdlet。例如,若要为Get-Help 创建别名"gh",请键入:

new-alias -name gh -valueget-help

可以在命令中像使用完整cmdlet 名称一样使用别名,并且可以一起使用别名和参数。

例如,若要获取Get-WmiObject cmdlet 的详细帮助,请键入:

get-help get-wmiobject -detailed

或键入:

gh get-wmiobject -detailed

保存别名

您创建的别名只保存在当前会话中。要在另一个会话中使用这些别名,请将它们添加到Windows

PowerShell 配置文件中。或者使用Export-Alias cmdlet 将别名保存到文件中。

有关详细信息,请键入:

get-help about_profile

获取别名

要获取当前会话中的所有别名(包括内置别名、Windows PowerShell 配置文件中的别名,以及在当

前会话中创建的别名),请键入:

get-alias

要获取特定别名,请使用Get-Alias cmdlet 的Name 参数。

例如,若要获取以"p"开头的别名,请键入:

get-alias -name p*

要获取特定项的别名,请使用Definition 参数。

例如,若要获取Get-ChildItem cmdlet 的别名,请键入:

get-alias -definitionGet-ChildItem

带有参数的命令的备用名称

可以将别名分配给cmdlet、脚本、函数或可执行文件。但是,不能将别名分配给命令及其参数。例如,可以将别名分配给Get-EventLog cmdlet,但不能将别名分配

给"get-eventlog -logname system"命令。

但是,可以创建包括命令的函数。要创建函数,请键入"function"一词,并在后面键入函数的名称。

键入命令,并用大括号({}) 将其括起。

例如,下面的命令创建syslog 函数。下面的函数表示"get-eventlog -logname system"命令:

function syslog {get-eventlog -logname system}

现在,就可键入"syslog"代替该命令。此外,还可以为syslog 函数创建别名。

有关函数的详细信息,请键入:

get-help about_functions

别名对象

Windows PowerShell 别名由作为System.Management.Automation.AliasInfo 类的实例的对象来表示。有关此类型的对象的详细信息,请参阅Microsoft Developer Network

(MSDN)

库中的"AliasInfo 类",地址为1b0302df28ea81c758f57897/fwlink/?LinkId=143644。

要查看别名对象的属性和方法,请获取别名。然后,将这些别名通过管道传递给Get-Member

cmdlet。例如:

get-alias | get-member

要查看特定别名(如"dir"别名)的属性的值,请获取别名。然后,将该别名通过管道传递给

Format-List cmdlet。例如,下面的命令获取"dir"别名。接下来,该命令将别名通过管道传递

给Format-List cmdlet。然后,该命令使用Format-List 的Property 参数以及通配符(*)

来显示"dir"别名的所有属性。下面的命令执行这些任务:

get-alias -name dir | format-list -property *

WINDOWS POWERSHELL ALIAS 提供程序

Windows PowerShell 包含Alias 提供程序。使用Alias 提供程序,可以像在文件系统驱动器

中一样查看Windows PowerShell 中的别名。

Alias 提供程序公开Alias: 驱动器。要进入Alias: 驱动器,请键入:

set-location alias:

要查看该驱动器的内容,请键入:

get-childitem

要从其他Windows PowerShell 驱动器查看该驱动器的内容,请将该驱动器名称放在路径的开头。

包括冒号(:)。例如:

get-childitem -path alias:

要获取有关特定别名的信息,请键入驱动器名称和别名名称。或者键入名称模式。

例如,若要获取以"p"开头的所有别名,请键入:

get-childitem -path alias:p*

有关Windows PowerShell Alias 提供程序的详细信息,请键入:

get-help alias-psprovider 另请参阅

new-alias

get-alias

set-alias

export-alias

import-alias

get-psprovider

get-psdrive

about_functions

about_profiles

about_providers

about_Arithmetic_Operators

主题

about_Arithmetic_Operators

简短说明

说明在Windows PowerShell 中执行算术运算的运算符。

详细说明

算术运算符计算数字值。可以使用一个或多个算术运算符对值进行加、减、乘和除运算,还可以计算除法运算中的余数(模)。

此外,加法运算符(+) 和乘法运算符(*) 还可对字符串、数组和哈希表进行运算。加法运算符将输入连

接起来。乘法运算符返回输入的多个副本。甚至可以在一个算术语句中混合使用对象类型。

用于计算语句的方法由表达式最左边的对象的类型确定。

Windows PowerShell 支持以下算术运算符:

运算符说明示例

-------- ----------- -------

+ 将整数相加;连接字符串、数组和哈希表。6+2 "file" + "name"

- 用一个值减去另一个值。6-2 (get-date).date - 1

- 对数字取负。-6+2

-4

* 将整数相乘;按指定次数复制字符串和数组。6*2 "w" * 3

/ 将两个值相除。6/2

% 返回除法运算的余数。7%2

运算符优先级

Windows PowerShell 按照以下顺序处理算术运算符:

圆括号()

- (对负数)

*, /, %

+,- (对减法)

Windows PowerShell 根据优先级规则从左到右处理表达式。以下示例演示优先级规则的效果:

C:\PS> 3+6/3*4

11

C:\PS> 10+4/2

12

C:\PS> (10+4)/2

7

C:\PS> (3+3)/ (1+1)

3

Windows PowerShell 计算表达式的顺序可能与您使用过的其他编程和脚本语言不同。下面的示例演示一

条复杂赋值语句。

C:\PS> $a = 0

C:\PS> $b = 1,2

C:\PS> $c = -1,-2

C:\PS> $b[$a] = $c[$a++]

C:\PS> $b

1

-1

在此示例中,表达式$a++ 在$c[$a++] 之前进行计算。计算$a++ 会更改$a 的值。$b[$a] 中的

变量$a 等于1(而不是0),因此该语句对$b[1](而不是$b[0])赋值。

对非数字类型进行加法和乘法运算

可以对数字、字符串、数组和哈希表进行加法运算。也可以对数字、

字符串和数组进行乘法运算。但是,不能对哈希表进行乘法运算。

在对字符串、数组或哈希表进行加法运算时,会将元素连接起来。

在连接集合(如数组或哈希表)时,会创建包含两个集合中的对象的新对象。

如果试图连接具有相同键的哈希表,则运算会失败。

例如,下面的命令创建两个数组,然后将这两个数组相加:

C:\PS> $a = 1,2,3

C:\PS> $b = "A","B,"C"

C:\PS> $a + $b

1

2

3

A

B

C

此外,还可以对不同类型的对象执行算术运算。Windows PowerShell 执行的运算由运算中最左边的对象

的Microsoft .NET Framework 类型确定。Windows PowerShell 会尝试将运算中的所有对象都转换为

第一个对象的.NET Framework 类型。如果转换对象成功,则执行适用于第一个对象的.NET Framework

类型的运算。如果在转换任何对象时失败,则运算失败。

下面的示例演示在包含不同对象类型的运算中使用加法和乘法运算符:

C:\PS> "file" + 16

file16

C:\PS> $array = 1,2,3

C:\PS> $array + 16

1

2

3

16

C:\PS> $array + "file"

1

2

3

file

C:\PS> "file" * 3

filefilefile

因为用于计算语句的方法由最左边的对象确定,所以Windows PowerShell 中的加法和乘法不是严格可

交换的。例如,(a + b) 并不总是等于(b + a),而(a * b) 也不总是等于(b * a)。

以下示例演示这一原则:

C:\PS> "file" + 2

file2

C:\PS> 2 + "file"

无法将值“file”转移为类型“System.Int32”。错误:

“输入字符串格式不正确。”

位于行:1 字符:4

+ 2 + <<<< "file"

C:\PS> "file" * 3

filefilefile

C:\PS> 3 * "file"

无法将值“file”转移为类型“System.Int32”。错误:

“输入字符串格式不正确。”

位于行:1 字符:4

+ 3 * <<<< "file"

哈希表的情况稍有不同。可以对哈希表进行加法运算。也可以将哈希表与数组相加。

但是,不能将任何其他类型与哈希表相加。

下面的示例演示如何将哈希表相加以及如何与其他对象相加:

C:\PS> $hash1 = @{a=1; b=2; c=3}

C:\PS> $hash2 = @{c1="Server01"; c2="Server02"}

C:\PS> $hash1 + $hash2

Name Value

---- -----

c2 Server02 1

b 2

c1 Server01 3

C:\PS> $hash1 + 2

You can add another hash table only to a hash table.

At line:1 char:9

+ $hash1 + <<<< 2

C:\PS> 2 + $hash1

Cannot convert "System.Collections.Hashtable" to "System.Int32".

At line:1 char:4

+ 2 + <<<< $hash1

下面的示例演示可以将哈希表与数组相加。整个哈希表作为单个对象添加到数组中。

C:\PS> $array = 1,2,3

C:\PS> $array + $hash1

1

2

3

Name Value

---- -----

a 1

b 2

c 3

C:\PS> $sum = $array + $hash1

C:\PS> $sum.count

4

C:\PS> $sum[3]

Name Value

---- -----

a 1

b 2

c 3

PS C:\ps-test> $sum + $hash2

1

2

3

Name Value

---- -----

a 1

b 2

c 3

c2 Server02

下面的示例演示不能对包含相同键的哈希表进行加法运算:

C:\PS> $hash1 = @{a=1; b=2; c=3}

C:\PS> $hash2 = @{c="red"}

C:\PS> $hash1 + $hash2

Bad argument to operator '+': Item has already been added.Key

in dictionary: 'c' Key being added: 'c'.

At line:1 char:9

+ $hash1 + <<<< $hash2

尽管加法运算符十分有用,在向哈希表和数组添加元素时,请使用赋值运算符。有关详细信息,请参阅

about_assignment_operators。以下示例使用+= 赋值运算符将项添加到数组:

C:\PS> $array

1

2

3

C:\PS> $array + "file"

1

2

3

file

C:\PS> $array

1

2

3

C:\PS> $array += "file"

C:\PS> $array

1

2

3

file

C:\PS> $hash1

Name Value

---- -----

a 1

b 2

c 3

C:\PS> $hash1 += @{e = 5}

C:\PS> $hash1

Name Value

---- -----

a 1

b 2

e 5

c 3

Windows PowerShell 自动选择最适于表示结果而不丢失精度的.NET Framework 数值类型。例如:

C:\PS> 2 + 3.1

5.1

C:\PS> (2).GetType().FullName

System.Int32

C:\PS> (2 + 3.1).GetType().FullName

System.Double

如果运算结果超出类型的表示范围,则扩大结果的类型以容纳结果,如下面的示例所示:

C:\PS> (512MB).GetType().FullName

System.Int32

C:\PS> (512MB * 512MB).GetType().FullName

System.Double

结果的类型不一定与其中某个操作数相同。在下面的示例中,负值不能转换为无符号整数,而无符号整数太

大,不能转换为Int32:

C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname

System.Int64

在此示例中,Int64 可以容纳这两个类型。

System.Decimal 类型是一个例外。如果任意一个操作数是Decimal 类型,则结果将是Decimal 类

型。如果结果超出Decimal 类型的表示范围,将不会转换为Double。而会生成错误。

C:\PS> [Decimal]::maxvalue

79228162514264337593543950335

C:\PS> [Decimal]::maxvalue + 1

Value was either too large or too small for a Decimal.

At line:1 char:22

+ [Decimal]::maxvalue + <<<< 1

算术运算符和变量

此外,还可以将算术运算符用于变量。运算符对变量的值执行运算。

下面的示例演示将算术运算符用于变量:

C:\PS> $intA = 6

C:\PS> $intB = 4

C:\PS> $intA + $intB

10

C:\PS> $a = "Windows "

C:\PS> $b = "PowerShell "

C:\PS> $c = 2

C:\PS> $a + $b + $c

Windows PowerShell 2

算术运算符和命令

在表达式中,算术运算符通常用于数字、字符串和数组。不过,

算术运算符也可以用于命令返回的对象以及这些对象的属性。

下面的示例演示如何通过Windows PowerShell 命令在表达式中使用算术运算符:

C:\PS> get-date

Wednesday, January 02, 2008 1:28:42 PM

C:\PS> $day = new-timespan -day 1

C:\PS> get-date + $day

Thursday, January 03, 2008 1:34:52 PM

C:\PS> get-process | where {($_.ws * 2) -gt 50mb}

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) IdProcessName ------- ------ ----- ----- ----- ------ -- -----------

1896 39 50968 30620 264 1,572.55 1104 explorer

12802 78 188468 81032 753 3,676.39 5676 OUTLOOK

660 9 36168 26956 143 12.20 988 powershell

561 14 6592 28144 110 1,010.09 496 services

3476 80 34664 26092 234 ...45.69 876 svchost

967 30 58804 59496 416 930.97 2508 WINWORD

示例

下面的示例演示如何在Windows PowerShell 中使用算术运算符:

C:\PS> 1 + 1

2

C:\PS> 1 - 1

C:\PS> -(6 + 3)

-9

C:\PS> 6 * 2

12

C:\PS> 7 / 2

3.5

C:\PS> 7 % 2

1

C:\PS> w * 3

www

C:\PS> 3 * "w"

Cannot convert value "w" to type "System.Int32".Error: "Input string was not in a correct format."

At line:1 char:4

+ 3 * <<<< "w"

PS C:\ps-test> "Windows" + " " + "PowerShell"

Windows PowerShell

PS C:\ps-test> $a = "Windows" + " " + "PowerShell"

PS C:\ps-test> $a

Windows PowerShell

C:\PS> $a[0]

W

C:\PS> $a = "TestFiles.txt"

C:\PS> $b = "C:\Logs\"

C:\PS> $b + $a

C:\Logs\TestFiles.txt

C:\PS> $a = 1,2,3

C:\PS> $a + 4

1

2

3

4

C:\PS> $servers = @{0 = "LocalHost"; 1 = "Server01"; 2 = "Server02"} C:\PS> $servers + @{3 = "Server03"}

Name Value

---- -----

3 Server03

2 Server02

1 Server01

0 LocalHost

C:\PS> $servers

Name Value

---- -----

2 Server02

1 Server01

0 LocalHost

C:\PS> $servers += @{3 = "Server03"} #Use assignment operator

C:\PS> $servers

Name Value

---- -----

3 Server03

2 Server02

1 Server01

0 LocalHost

另请参阅

about_arrays

about_assignment_operators

about_comparison_operators

about_hash_tables

about_operators

about_variables

Get-Date

New-TimeSpan

about_Arrays

主题

about_Arrays

简短说明

描述用于存储数据元素的紧凑型数据结构

详细说明

数组是一种数据结构,用于存储由相同类型的数据元素组成的集合。Windows PowerShell 支持的数

据元素包括string、int(32 位整数)、long(64 位整数)、bool(布尔)、byte 和其他Microsoft .NET Framework 对象类型。

创建和初始化数组

若要创建和初始化数组,请将多个值赋予变量。

存储在数组中的值以逗号分隔,并以赋值运算符(=) 与变量名称分开。

例如,若要创建名为$A 并且包含七个数字(int) 值22、5、10、8、12、9 和80 的数组,请键入:

$A = 22,5,10,8,12,9,80

还可以使用范围运算符(..) 创建并初始化数组。例如,若要创建并初始化名为"$B"并且包含值5 到

8 的数组,请键入:

$B = 5..8

结果是,$B 包含四个值:5、6、7 和8。

如果没有指定数据类型,Windows PowerShell 将以对象数组(类型:object[])的形式创建每个数组。

若要确定数组的数据类型,请使用GetType() 方法。例如,若要确定$a 数组的数据类型,请键入:

$a.gettype()

若要创建强类型数组(即只能包含特定类型的值的数组),请将变量转换为某个数组类型,例如,

string[]、long[] 或int32[]。若要转换数组,请将数组类型括在方括号内,放置在变量名称的前面。

例如,若要创建名为$ia 的32 位整数数组,并且其中包含四个整数(1500、2230、3350 和4000),

请键入:

[int32[]]$ia = 1500,2230,3350,4000

结果是,$ia 数组只能包含整数。

可以创建转换为在Microsoft .NET Framework 中任何受支持类型的数组。例如,由Get-Process 检索以表示

进程的对象的类型为System.Diagnostics.Process。若要创建进程对象的强类型数组,请输入下

面的命令:

[Diagnostics.Process[]]$zz = Get-Process

可以使用cmdlet、函数或语句的输出填充数组。例如,下面的语句创建包含以字母"co"开头并在当

前计算机上运行的进程的数组:

$LocalProcesses = get-process co*

如果该语句只获取了一个进程,则$LocalProcesses 变量不是数组。若要确保命令创建数组,请使

用数组子表达式运算符@,如下面的示例所示:

$LocalProcesses = @(get-process co*)

即使该命令返回一个进程,$LocalProcesses 变量也是数组。即使该数组只有一个成员,也可以像其

他任何数组一样进行处理。例如,可以向其中添加其他对象。有关详细信息,请参阅about_Operators。

读取数组

可以使用数组的变量名称(如$A 或$a)来引用数组。Windows PowerShell 不区分大小写。

若要显示数组中的所有元素,请键入数组名称。例如:

$a

可以使用索引来引用数组中的元素,其开始位置是0。请将索引号放在方括号中。例如,若要显示$a

数组的第一个元素,请键入:

$a[0]

若要显示$a 数组的第三个元素,请键入:

$a[2]

负数则从数组的末尾计数。例如,"-1"是指数组的最后一个元素。若要显示数组的最后3 个元素,请

键入:

$a[-3..-1]

但是,使用该表示法时请小心。

$a[0..-2]

此命令不引用数组中除最后一个以外的所有元素。

它引用数组中第一个、最后一个和倒数第二个元素。

可以使用范围运算符来显示数组中所有值的子集。例如,若要显示在索引位置1 到3 的数据元素,请

键入:

$a[1..3]

可以使用加号运算符(+) 将范围与数组元素的列表组合在一起。例如,若要显示在索引位置0、2 和4

到6 的元素,请键入:

$a[0,2+4..6]

若要确定数组中有多少项,请将范围与数组的长度属性组合在一起。例如,若要显示从索引位置2 到数

组末尾的元素,请键入:

$a[2..($a.length-1)]

长度设置为-1,因为索引从位置0 开始。因此,在有三个元素的数组(1,2,3) 中,第三个元素的索引

是2,该索引比数组长度小一。

还可以使用循环结构(如Foreach、For 和While 循环)来引用数组中的元素。例如,若要使用

Foreach 循环显示$a 数组中的元素,请键入:

foreach ($element in $a) {$element}

Foreach 循环将遍历数组,并返回数组中的每个值,直至到达数组的末尾。

如果在检验数组元素的同时需要递增计数器,则可以使用For 循环。例如,若要使用For 循环在数组

中每隔一个值返回一次值,请键入:

for ($i = 0; $i -le ($a.length - 1); $i += 2) {$a[$i]}

可以使用While 循环显示数组元素,直到所定义的条件不再为true。例如,若要在数组索引小于4 时

显示$a 数组中的元素,请键入:

$i=0

while($i -lt 4) {$a[$i]; $i++}

若要了解数组的属性和方法(如Length 属性和SetValue 方法),请使用Get-Member cmdlet 的

InputObject 参数。将数组通过管道传递给Get-Member 时,它将显示有关数组中的对

象的信息。

使用InputObject 参数时,它将显示有关数组的信息。

若要查找$a 数组的属性和方法,请键入:

get-member -inputobject $a

操作数组

可以更改数组中的元素、向数组添加元素以及将两个数组中的值组合成第三个数组。

若要更改数组中特定元素的值,请指定数组名称和要更改的元素的索引,然后使用赋值运算符(=) 指定

元素的新值。例如,若要将$a 数组中第二项的值(索引位置1)更改为10,请键入:

$a[1] = 10

还可以使用数组的SetValue 方法更改值。下面的示例将$a 数组的第二个值(索引位置1)更改为500:

$a.SetValue(500,1)

通过使用+= 运算符,可以将元素追加到现有数组的末尾。此运算符将增加现有值。

将该运算符用于数组元素时,它会使元素的值增加。将该运算符用于数组本身

时,它会追加值。例如,若要将值为200 的元素追加到$a 数组的末尾,请键入:

$a += 200

从数组中删除元素很不容易,但可以新建一个数组,使之只包含从现有数组中选择出来的元素。例如,

若要使用$a 数组中除索引位置2 的值以外的所有元素创建$t 数组,请键入:

$t = $a[0,1 + 3..($a.length - 1)]

若要将两个数组组合成一个数组,请使用加号运算符(+)。下面的示例创建两个数组,然后组合这两个

数组,最后显示所得到的组合数组。

$x = 1,3

$y = 5,9

$z = $x + $y

结果是,$z 数组包含1、3、5 和9。

本文来源:https://www.bwwdw.com/article/bkmq.html

Top