admin 管理员组

文章数量: 1086019


2024年12月26日发(作者:网页培训设计)

Powershell 定义变量

Powershell, 程序设计 添加评论

十二 052011

变量可以临时保存数据,因此可以把数据保存在变量中,以便进一步操作。

帮助

#定义变量

$a=10

01

$b=4

02

03

#计算变量

04

$result=$a*$b

05

06

07

$msg="保存文本"

08

09

10

#输出变量

11

$result

$msg

40

保存文本

powershell 不需要显示地去声明,可以自动创建变量,只须记住变量的前缀为$.

创建好了变量后,可以通过变量名输出变量,也可以把变量名存在字符串中。但是有个例

外单引号中的字符串不会识别和处理变量名。

选择变量名

在powershell中变量名均是以美元符”$”开始,剩余字符可以是数字、字母、下划线的任意

字符,并且powershell变量名大小写不敏感($a和$A 是同一个变量)。

某些特殊的字符在powershell中有特殊的用途,一般不推荐使用这些字符作为变量名。当

然你硬要使用,请把整个变量名后缀用花括号括起来。

1 / 84

赋值和返回值

赋值操作符为“=”,几乎可以把任何数据赋值给一个变量,甚至一条cmdlet命令

,为什么,因为Powershell支持对象,对象可以包罗万象。

2 / 84

给多个变量同时赋值

赋值操作符不仅能给一个变量赋值,还可以同时给多个变量赋相同的值。

3 / 84

交换变量的值

要交换两个变量的值,传统的程序语言至少需要三步,并且还需定义一个中间临时变量。

在powershell中,交换两个变量的值,这个功能变得非常简单。

4 / 84

查看正在使用的变量

Powershell将变量的相关信息的记录存放在名为variable:的驱动中。如果要查看所有定义

的变量,可以直接遍历variable:

5 / 84

查找变量

因为有虚拟驱动variable:的存在,可以象查找文件那样使用通配符查找变量。例如要查询

以value打头的变量名。

验证变量是否存在

验证一个变量是否存在,仍然可以象验证文件系统那样,使用cmdlet Test-Path。为什

么?因为变量存在变量驱动器中。

6 / 84

删除变量

因为变量会在powershell退出或关闭时,自动清除。一般没必要删除,但是你非得删除,

也可以象删除文件那样删除它。

使用专用的变量命令

为了管理变量,powershell提供了五个专门管理变量的命令Clear-Variable,Get-

Variable,New-Variable,Remove-Variable,Set-Variable。因为虚拟驱动器variable:的

存在,clear,remove,set打头的命令可以被代替。但是Get-Variable,New-Variable。

却非常有用new-variable可以在定义变量时,指定变量的一些其它属性,比如访问权限。

同样Get-Variable也可以获取这些附加信息。

变量写保护

可以使用New-Variable 的option选项 在创建变量时,给变量加上只读属性,这样就不能

给变量重新赋值了。

7 / 84

但是可以通过删除变量,再重新创建变量更新变量内容。

有没有权限更高的变量,有,那就是:选项Constant,常量一旦声明,不可修改

8 / 84

变量描述

在New-Variable 可以通过-description 添加变量描述,但是变量描述默认不会显示,可以

通过Format-List 查看。

9 / 84

Powershell自动化变量

Powershell, 程序设计 添加评论

十二 072011

Powershell 自动化变量 是那些一旦打开Powershell就会自动加载的变量。

这些变量一般存放的内容包括

用户信息:例如用户的根目录$home

配置信息:例如powershell控制台的大小,颜色,背景等。

运行时信息:例如一个函数由谁调用,一个脚本运行的目录等。

10 / 84

powershell中的某些自动化变量只能读,不能写。例如:$Pid。

可以通过Get-Help about_Automatic_variables查看Automatic_variables的帮助。

TOPIC

about_Automatic_Variables

主题

about_Automatic_Variables

简短说明

说明存储 Windows PowerShell 状态信息的变量。

这些变量由 Windows PowerShell 创建并维护。

详细说明

下面是 Windows PowerShell 中的自动变量的列表:

$$

包含会话所收到的最后一行中的最后一个令牌。

11 / 84

$?

包含最后一个操作的执行状态。如果最后一个操作成功,则包含 TRUE,失败则包含

FALSE。

$^

包含会话所收到的最后一行中的第一个令牌。

$_

包含管道对象中的当前对象。在对管道中的每个对象或所选对象执行操作的命令中,可以

使用此变量。

$Args

包含由未声明参数和/或传递给函数、脚本或脚本块的参数值组成的数组。

在创建函数时可以声明参数,方法是使用 param 关键字或在函数名称后添加以圆括号括

起、逗号

分隔的参数列表。

$Console

包含在会话中最近使用的控制台文件 (.psc1) 的路径。在通过 PSConsoleFile 参数启动

Windows PowerShell 或使用 Export-Console cmdlet 将管理单元名称导出到控制台文件

时,将填充此变量。

在使用不带参数的 Export-Console cmdlet 时,它自动更新在会话中最近使用的控制台文

件。

可以使用此自动变量确定要更新的文件。

$Error

包含错误对象的数组,这些对象表示最近的一些错误。最近的错误是该数组中的第一个错

误对象

($Error[0])。

$Event

包含一个 PSEventArgs 对象,该对象表示一个正在被处理的事件。

此变量只在事件注册命令(例如 Register-ObjectEvent)的 Action 块内填充。

此变量的值是 Get-Event cmdlet 返回的同一个对象。

12 / 84

因此,可以在 Action 脚本块中使用 $Event 变量的属性(例如

$nerated)。

$EventSubscriber

包含一个 PSEventSubscriber 对象,该对象表示正在被处理的事件的事件订阅者。

此变量只在事件注册命令的 Action 块内填充。此变量的值

是 Get-EventSubscriber cmdlet 返回的同一个对象。

$ExecutionContext

包含一个 EngineIntrinsics 对象,该对象表示 Windows PowerShell 主机的执行上下文。

可以使用此变量来查找可用于 cmdlet 的执行对象。

$False

包含 FALSE。可以使用此变量在命令和脚本中表示 FALSE,而不是使用字符串”false”。

如果

该字符串转换为非空字符串或非零整数,则可将该字符串解释为 TRUE。

$ForEach

包含 ForEach-Object 循环的枚举数。可以对 $ForEach 变量的值使用枚举数的属性和方

法。

此变量仅在运行 For 循环时存在,循环完成即会删除。

$Home

包含用户的主目录的完整路径。此变量等效于 %homedrive%%homepath% 环境变量。

$Host

包含一个对象,该对象表示 Windows PowerShell 的当前主机应用程序。可以使用此变量

在命

令中表示当前主机,或者显示或更改主机的属性,如 $n、

$tCulture

或 $kgroundcolor(“Red”)。

$Input

一个枚举数,它包含传递给函数的输入。$Input 变量区分大小写,只能用于函数和脚本

块。(脚

本块本质上是未命名的函数。)在函数的 Process 块中,$Input 变量包含当前位于管道中

13 / 84

的对

象。在 Process 块完成后,$Input 的值为 NULL。如果函数没有 Process 块,则 $Input

的值可用于 End 块,它包含函数的所有输入。

$LastExitCode

包含运行的最后一个基于 Windows 的程序的退出代码。

$Matches

$Matches 变量与 -match 和 -not match 运算符一起使用。

将标量输入提交给 -match 或 -notmatch 运算符时,如果检测到匹配,则会返回一个布尔

值,

并使用由所有匹配字符串值组成的哈希表填充 $Matches 自动变量。有关 -match 运算符的

详细

信息,请参阅 about_comparison_operators。

$MyInvocation

包含一个对象,该对象具有有关当前命令(如脚本、函数或脚本块)的信息。可以使用该

对象中的

信息(如脚本的路径和文件名 ($) 或函数的名称

($))来标识当前命令。对于查找正在运行的脚本的名

称,这非常有用。

$NestedPromptLevel

包含当前提示级别。值 0 指示原始提示级别。该值在进入嵌套级别时递增,在退出嵌套级

别时递减。

例如,在使用 $estedPrompt 方法时,Windows PowerShell 会出现嵌套命令

提示符。在 Windows PowerShell 调试程序中到达断点时,Windows PowerShell 也会出

现嵌

套命令提示符。

在进入嵌套提示时,Windows PowerShell 暂停当前命令,保存执行上下文,并递增

$NestedPromptLevel 变量的值。要创建更多嵌套命令提示符(最多 128 级)或返回到原

始命

令提示符,请完成命令,或键入”exit”。

14 / 84

$NestedPromptLevel 变量有助于跟踪提示级别。可以创建包含此值的备用 Windows

PowerShell 命令提示符,以使此值始终可见。

$NULL

包含 NULL 或空值。可以在命令和脚本中使用此变量表示 NULL,而不是使用字符

串”NULL”。

如果该字符串转换为非空字符串或非零整数,则可将该字符串解释为 TRUE。

$PID

包含承载当前 Windows PowerShell 会话的进程的进程标识符 (PID)。

$Profile

包含当前用户和当前主机应用程序的 Windows PowerShell 配置文件的完整路径。可以在

命令

中使用此变量表示配置文件。例如,可以在命令中使用此变量确定是否已创建某个配置文

件:

test-path $profile

也可以在命令中使用此变量创建配置文件:

new-item -type $pshome -force

此外,还可以在命令中使用此变量在记事本中打开配置文件:

notepad $profile

$PSBoundParameters

包含活动参数及其当前值的字典。只有在声明参数的作用域(如脚本或函数)中,

此变量才有值。可以使用此变量显示或更改参数的当前值,也可以将参数值传递给

其他脚本或函数。

例如:

function test {

param($a, $b)

15 / 84

# Display the parameters in dictionary format.

$psboundparameters

# Call the Test1 function with $a and $b.

test1 @psboundparameters

}

$PsCmdlet

包含一个对象,该对象表示正在运行的 cmdlet 或高级函数。

可以在 cmdlet 或函数代码中使用该对象的属性和方法来响应使用的条件。例如,

ParameterSetName 属性包含正在使用的参数集的名称,而 ShouldProcess 方法将

WhatIf

和 Confirm 参数动态添加到 cmdlet。

有关 $PSCmdlet 自动变量的详细信息,请参阅 about_Functions_Advanced。

$PsCulture

包含操作系统中当前所用的区域性的名称。区域性确定数字、货币和日期等项的显示格

式。这是系

统的 属性的值。要获取系统

的 eInfo 对象,请使用 Get-Culture cmdlet。

$PSDebugContext

在调试期间,此变量包含有关调试环境的信息。在其他时间,此变量包含 NULL 值。因

此,可以使

用此变量指示调试程序是否拥有控制权。填充之后,此变量包含一个具有 Breakpoints 和

InvocationInfo 属性的 PsDebugContext 对象。InvocationInfo 属性有多个十分有用的

属性,包括 Location 属性。Location 属性指示正在调试的脚本的路径。

$PsHome

包含 Windows PowerShell 的安装目录的完整路径(通常为

%windir%System32WindowsPowerShellv1.0)。可以在 Windows PowerShell 文件

的路径中使用此变量。例如,下面的命令在概念性帮助主题中搜索”variable”一词:

select-string -pattern variable -path $pshome*.txt

16 / 84

$PSScriptRoot

包含要从中执行脚本模块的目录。

通过此变量,脚本可以使用模块路径来访问其他资源。

$PsUICulture

包含操作系统中当前所用的用户界面 (UI) 区域性的名称。UI 区域性确定哪些文本字符串用

于用户

界面元素(如菜单和消息)。这是系统的

属性的值。要获取系统

的 eInfo 对象,请使用 Get-UICulture cmdlet。

$PsVersionTable

包含一个只读哈希表,该哈希表显示有关在当前会话中运行的 Windows PowerShell 版本

的详

细信息。

该表包括下列项:

CLRVersion: 公共语言运行时 (CLR) 的版本

BuildVersion: 当前版本的内部版本号

PSVersion: Windows PowerShell 版本号

WSManStackVersion: WS-Management 堆栈的版本号

PSCompatibleVersions: 与当前版本兼容的 Windows PowerShell 版本

SerializationVersion 序列化方法的版本

PSRemotingProtocolVersion

Windows PowerShell 远程管理协议的版本

$Pwd

包含一个路径对象,该对象表示当前目录的完整路径。

$Sender

包含生成此事件的对象。此变量只在事件注册命令的 Action 块内填充。

17 / 84

此变量的值也可在 Get-Event 返回的 PSEventArgs

(tArgs) 对象的 Sender 属性中找到。

$ShellID

包含当前 shell 的标识符。

$SourceArgs

包含表示正在被处理的事件的事件参数的对象。此变量只在事件注册命令的 Action

块内填充。此变量的值也可在 Get-Event 返回的 PSEventArgs

(tArgs) 对象的 SourceArgs 属性中找到。

$SourceEventArgs

包含一个对象,该对象表示从正在被处理的事件的 EventArgs 中派生出的

第一个事件参数。此变量只在事件注册命令的 Action 块内填充。

此变量的值也可在 Get-Event 返回的 PSEventArgs

(tArgs) 对象的 SourceArgs 属性中找到。

$This

在定义脚本属性或脚本方法的脚本块中,$This 变量引用要扩展的对象。

$True

包含 TRUE。可以在命令和脚本中使用此变量表示 TRUE。

另请参阅

about_Hash_Tables

about_Preference_Va

riables

about_Variables

Powershell 通过函数扩展别名

Powershell, 程序设计 添加评论

十一 252011

18 / 84

在Powershell中设置别名的确方便快捷,但是在设置别名的过程中并设置参数的相关信

息。尽管别名会自动识别参数,但是如何把经常使用的参数默认设定在别名里面呢?例如

Test-Connection -Count 2 -ComputerName,让-”-Count 2″ 固化在别名中。

这时简单的别名无法完成上述需求,可以通过函数来完成它,并且一旦把函数拉过来,定

义别名会变得更加灵活。

有了函数牵线,别名可以完成更高级更强大的功能,其中$args为参数的占位符,经测

试,发现这个占位符必须以$args命名,否则不能识别,会抛出异常:

Cannot validate argument on parameter ‘ComputerName’. The argument is null or empty.

Supply an arg

nt that is not null or empty and then try the command again.

Powershell 快速编辑模式和标准模式

Powershell, 程序设计 添加评论

十一 232011

powershell控制台有两种模式,一个是快速编辑模式,一个是标准模式。

快速编辑模式和标准模式的切换可以通过控制台标题栏->鼠标右击->属性->选项->编辑选

项 。

19 / 84

powershell标准模式

鼠标右击选择标记后才能实现复制和粘切功能。

powershell快速编辑模式

可以通过鼠标右键选择任意矩形区域内的文本,并且鼠标右击实现复制功能。

Powershell 自定义控制台

Powershell, 程序设计 添加评论

十一 232011

右击标题栏选择”属性”弹出powershell控制台对话框。

在这里有三个四个选项卡:选项、字体、布局和颜色。

“选项”设置光标,历史记录,编辑模式的切换。

“字体”设置字体的名称和大小

“布局”设置窗口的缓冲区、窗口的大小、窗口起始坐标

20 / 84

“颜色”设置屏幕和对话框的背景色和前景色。

Powershell Foreach 循环

Powershell, 程序设计 添加评论

一 232012

Foreach-object 为cmdlet命令,使用在管道中,对管道结果逐个处理,foreach为遍历集

合的关键字。

下面举两个例子:

帮助

01

$array=7..10

02

foreach

($n

in $array)

03

04

{

05

$n*$n

06

}

07

08

09

#49

10

#64

11

#81

12

13

#100

14

15

foreach($ dir

c:windows)

16

17

{

18

if($ -gt

1mb)

19

21 / 84

20

{

21

$

}

}

#

#

这里只为了演示foreach,其实上面的第二个例子可以用Foreach-Object更简洁。

Powershell 条件操作符

Powershell, 程序设计 添加评论

一 162012

Powershell 中的比较运算符

-eq :等于

-ne :不等于

-gt :大于

-ge :大于等于

-lt :小于

-le :小于等于

-contains :包含

-notcontains :不包含

进行比较

可以将比较表达式直接输入进Powershell控制台,然后回车,会自动比较并把比较结果返

回。

22 / 84

23 / 84

求反

求反运算符为-not 但是像高级语言一样”! “ 也支持求反。

布尔运算

-and :和

-or :或

-xor :异或

-not :逆

24 / 84

比较数组和集合

过滤数组中的元素

25 / 84

验证一个数组是否存在特定元素

Powershell Where-Object 条件过滤

Powershell, 程序设计 添加评论

一 172012

本篇会对条件判断进行实际应用。在管道中可以通过条件判断过滤管道结果,Where-

Object会对集合逐个过滤,将符合条件的结果保留。

过滤管道结果

使用Get-Process返回所有的当前进程 ,但是你可能并不对所有的进程感兴趣,然后通过

每个Process对象的属性进行过滤。首先得知道每个对象支持那些属性。

26 / 84

27 / 84

28 / 84

29 / 84

根据进程名过滤所有记事本进程。

30 / 84

根据进程名过滤所有IE进程。

根据company过滤所有产品发布者以”Microsoft”打头的进程:

31 / 84

使用别名

因为Where-Object的使用概率比较高,所以有一个很形象的别名 ? 可以使用:

Powershell ForEach-Object 循环

Powershell, 程序设计 添加评论

一 222012

32 / 84

Powershell管道就像流水线,对于数据的处理是一个环节接着一个环节,如果你想在某一

环节对流进来的数据逐个细致化的处理,可是使用ForEach-Object,$_ 代表当前的数

据。

对管道对象逐个处理

如果使用Get-WmiObject 获取系统中的服务,为了排版可能会也会使用Format-Table对

结果进行表格排版。

33 / 84

但是如果想对每个服务进行更定制化的处理可是使用ForEach-Object

结合条件处理

ForEach-Object的处理可以包含任意Powershell脚本,当然也包括条件语句

帮助

Get-WmiObject

Win32_Service | ForEach-Object

{

1

if ($_.ProcessId -gt

3000)

2

3

{ "{0}({1})"

-f

$_.DisplayName,$_.ProcessID}

4

}

34 / 84

调用方法

在ForEach-Object中,$_代表当前对象,当然也允许通过$_,调用该对象支持的方法。

下面的例子杀死所有IE浏览器进程:

35 / 84

Get-Process : 找不到名为“iexplore”的进程。请验证该进程名称,然后再次调用 cmdlet。

所在位置 行:1 字符: 12

+ Get-Process <<<< iexplore

+ CategoryInfo : ObjectNotFound: (iexplore:String) [Get-Process],

ProcessCommandException

+ FullyQualifiedErrorId : NoProcessFoundForGivenName,hell.

cessCommand

Powershell 别名

Powershell, 程序设计 添加评论

十一 242011

cmdlet 的名称由一个动词和一个名词组成,其功能对用户来讲一目了然。但是对于一个经

常使用powershell命令的人每天敲那么多命令也很麻烦啊。能不能把命令缩短一点呢?于

是“别名”就应运而生了。Powershell内部也实现了很多常用命令的别名。例如Get-

ChildItem,列出当前的子文件或目录。它有两个别名:ls 和 dir,这两个别名来源于unix

的shell和windows的cmd。

因此别名有两个作用:

继承:继承unix-shell和windows-cmd。

方便:方便用户使用。

处理别名:

查询别名所指的真实cmdlet命令。

36 / 84

37 / 84

查看可用的别名

查看可用的别名,可以通过” ls alias:” 或者 ”Get-Alias“

如何查看所有以Remove打头的cmdlet的命令?

38 / 84

说明:dir alias:获取的是别名的数组,通过where对数组元素进行遍历,$_代表当前元

素,alias的Definition为String类型,因为powershell支持.net,.net中的string类有一

个方法Startswith。通过where过滤集合在powershell中使用非常广泛。

有的cmdlet命令可能有2-3个别名,我们可以通过下面的命令查看所有别名和指向cmdlet

的别名的个数。

39 / 84

40 / 84

41 / 84

42 / 84

43 / 84

44 / 84

创建自己的别名

给记事本创建一个别名,并查看该别名;

删除自己的别名

别名不用删除自定义的别名在powershell退出时会自动清除。但是请放心,powershell内

置别名(诸如ls,dir,fl等)不会清除。如果你非得手工删除别名。请使用

45 / 84

保存自己的别名

可以使用Export-Alias将别名导出到文件,需要时再通过Import-Alias导入。但是导入时

可能会有异常,提示别名已经存在无法导入:

PS C:> Import-Alias 1

Import-Alias : Alias not allowed because an alias with

the name 'ac' already exists.

At line:1 char:13

+ Import-Alias <<<< 1

+ CategoryInfo : ResourceExists: (ac:String)

[Import-Alias], SessionStateException

+ FullyQualifiedErrorId :

AliasAlreadyExists,Al

iasCommand

这时可以使用Force强制导入。

Powershell 进行数学运算

Powershell, 程序设计 添加评论

十一 242011

46 / 84

我们可以把powershell当成一个计算器。象键入命令行那样输入数学表达式,回车,

powershell会自动计算并把结果输出。常用的加减乘除模(+,-,*,/,%)运算和小括号表达

式都支持。

powershell也能自动识别计算机容量单位,包括KB,MB,GB,TB,PB

47 / 84

假如一个网站每个页面大小为80kb,统计显示每天的PV操作为800,1个月下来占用的

带宽:

假如一个网站的每天人均PV操作为5,页面大小为80Kb,主机提供商限制的总流量为

10G,那平均每天的最大访客数

为:

Powershell 快捷键

Powershell, 程序设计 添加评论

十一 232011

Powershell的快捷键和cmd,linux中的shell,都比较像。

ALT+F7

PgUp PgDn

Enter

End

Del

Esc

F2

F4

F7

清除命令的历史记录

显示当前会话的第一个命令和最后一个命令

执行当前命令

将光标移至当前命令的末尾

从右开始删除输入的命令字符

清空当前命令行

自动补充历史命令至指定字符

(例如历史记录中存在Get-Process,按F2,提示"Enter char to copy up to",键入‘s’,

自动补齐命令:Get-Proce)

删除命令行至光标右边指定字符处

对话框显示命令行历史记录

48 / 84

F8

F9

左/右方向键

上/下方向键

Home

Backspace

Ctrl+C

检索包含指定字符的命令行历史记录

根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看

左右移动光标

切换命令行的历史记录

光标移至命令行最左端

从右删除命令行字符

取消正在执行的命令

Ctrl+左/右方向

在单词之间移动光标

Ctrl+Home

Tab

删除光标最左端的所有字符

自动补齐命令或者文件名

Powershell Do While 循环

Powershell, 程序设计 添加评论

一 242012

Do和While可能产生死循环,为了防止死循环的发生,你必须确切的指定循环终止的条

件。指定了循环终止的条件后,一旦条件不满足就会退出循环。

继续与终止循环的条件

do-while()会先执行再去判断,能保证循环至少执行一次。

49 / 84

单独使用While

终止当前循环

使用continue关键字,可是终止当前循环,跳过continue后其它语句,重新下一次循环。

50 / 84

帮助

$n=1

while($n

-lt

6)

{

01

02

if($n

-eq

4)

03

{

04

$n=$n+1

05

06

continue

07

08

}

09

10

else

11

{

12

$n

13

}

14

15

$n=$n+1

16

}

17

1

18

19

2

3

5

跳出循环语句

跳出循环语句使用break关键字

帮助

$n=1

while($n

-lt

6)

01

02

{

03

if($n

-eq

4)

04

{

05

06

break

07

}

08

$n

09

10

$n++

}

Powershell IF-ELSEIF-ELSE 条件

Powershell, 程序设计 添加评论

一 182012

Where-Object 进行条件判断很方便,如果在判断后执行很多代码可以使用IF-ELSEIF-

ELSE语句。语句模板:

51 / 84

If(条件满足){

如果条件满足就执行代码

}

Else

{

如果条件不满足

}

条件判断必须放在圆括号中,执行的代码必须紧跟在后面的花括号中。

Powershell Switch 循环

Powershell, 程序设计 添加评论

一 262012

Switch 本是多路分支的关键字,但是在Powershell中由于Switch支持集合,所以也可以

使用它进行循环处理。下面举两个例子。

第一个将Foreach循环转换成Switch循环:

帮助

01

#使用Foreach循环

02

$nums=10..7

03

foreach($n

in $nums)

04

05

{

06

"n=$n"

07

}

08

52 / 84

09

n=10

10

n=9

11

n=8

12

13

n=7

14

15

#使用Switch循环

16

17

$nums

= 10..7

18

Switch ($nums)

19

{

20

21

Default { "n= $_"

}

22

}

n= 10

n= 9

n= 8

n= 7

有时对集合的处理,在循环中还须条件判断,使用Switch循环可以一部到位,例如:

帮助

$nums

= 10..7

Switch ($nums)

01

{

02

{($_ % 2) -eq

0} {"$_ 偶数"}

03

04

{($_ % 2) -ne

0} {"$_ 基数"}

05

}

06

07

08

10 偶数

09

10

9 基数

11

8 偶数

7 基数

Powershell Switch 条件

Powershell, 程序设计 添加评论

一 212012

如果语句中有多路分支,使用IF-ELSEIF-ELSE不友好,可以使用Switch,看起来比较清

爽一点。

下面的例子将If-ElseIF-Else转换成Switch语句

帮助

01

# 使用 IF-ElseIF-Else

02

If( $value

-eq

1 )

03

53 / 84

04

{

05

"Beijing"

06

}

07

08

Elseif( $value

-eq

2)

09

{

10

11

"Shanghai"

12

}

13

Elseif( $value

-eq

3 )

14

{

15

"Tianjin"

16

17

}

18

Else

19

{

20

21

"Chongqing"

22

}

23

24

25

# 使用 Switch

26

switch($value)

{

1 {"Beijing"}

2 {"Shanghai"}

3 {"Tianjin"}

4 {"Chongqing"}

}

帮助

1

测试取值范围

使用 Switch 时缺省的比较运算符为 -eq 等于,你也可以自己定制比较条件,将条件放在花

括号中,必须保证条件表达式的返回值为布尔类型”$True”或”$False”

帮助

$value=18

# 使用 Switch 测试取值范围

01

switch($value)

02

03

{

04

{$_ -lt

10} {"小于10"}

05

06

10 {"等于10"}

07

{$_ -gt

10} {"大于10"}

08

}

09

10

#输出

#大于10

54 / 84

没有匹配条件

在IF-Else语句中如果没有合适的条件匹配,可以在Else中进行处理,同样在Switch语句

中如果case中没有条件匹配,可以使用关键字Default进行处理。

同样是上面的例子,稍加修改:

帮助

$value=-7

# 使用 Switch 测试取值范围

01

switch($value)

02

{

03

04

{($_ -lt

10) -and

( $_ -gt

0) } {"小于10"}

05

06

10 {"等于10"}

07

{$_ -gt

10} {"大于10"}

08

09

Default {"没有匹配条件"}

10

}

11

#Output:

#没有匹配条件

多个条件匹配

如果case中有多个条件匹配,那么每个匹配的条件都会进行处理,例如:

帮助

$value=2

# 使用 Switch 测试取值范围

01

switch($value)

02

{

03

{$_ -lt

5 } { "小于5"

}

04

05

{$_ -gt

0 } { "大于0"

}

06

07

{$_ -lt

100}{ "小于100"}

08

Default {"没有匹配条件"}

09

}

10

11

12

#小于5

13

#大于0

#小于100

如果碰到匹配条件时只处理一次,可以使用Break关键字

帮助

$value=99

01

55 / 84

02

# 使用 Switch 测试取值范围

03

switch($value)

04

{

05

06

{$_ -lt

5 } { "小于5"; break}

07

08

{$_ -gt

0 } { "大于0"; break}

09

{$_ -lt

100} { "小于100"; break}

10

11

Default {"没有匹配条件"}

}

#大于0

比较字符串

之前的条件比较的都是数字,接下来比较字符串,默认的条件判断为-eq ,我们知道在

Powershell中字符串的使用-eq比较大小写不敏感,所以才有下面的例子:

帮助

$domain=""

switch($domain)

01

02

{

03

""

{"Ok 1"}

04

""

{"Ok 2"

}

05

06

""

{"Ok 3"}

07

}

08

Ok 1

09

10

Ok 2

Ok 3

大小写敏感

怎样在比较字符串时能够恢复为大小写敏感模式,Switch有一个-case 选项,一旦指定了

这个选项,比较运算符就会从-eq 切换到 -ceq,即大小写敏感比较字符串:

帮助

$domain=""

1

#大小写敏感

2

switch -case

($domain)

3

{

4

5

""

{"Ok 1"}

6

""

{"Ok 2"

}

7

""

{"Ok 3"}

8

9

}

#Ok 3

56 / 84

使用通配符

字符串非常特殊,可是使用通配符,幸运的是Powershell也支持,果然Power啊。但是

在Switch语句后要指定 -wildcard 选项

帮助

$domain=""

#使用通配符

01

switch -wildcard($domain)

02

{

03

04

"*"

{"匹配'*'"}

05

"*.com"

{"匹配*.com"

}

06

07

"*.*.*"

{"匹配*.*.*"}

08

}

09

10

匹配'*'

11

匹配*.com

匹配*.*.*

在字符串匹配中,比通配符功能更强大是正则表达式,Powershell的Switch语句也支持,

真是太棒了。当然需要给Switch关键字指定选项-regex

帮助

$mail=""

#使用通配符

01

switch -regex

($mail)

02

{

03

04

"^www"

{"www打头"}

05

06

"com$"

{"com结尾"

}

07

"d{1,3}.d{1,3}.d{1,3}.d{1,3}"

{"IP地址"}

08

}

09

10

11

#www打头

#com结尾

同时处理多个值

Switch支持对集合所有元素进行匹配,下面的例子使用Powershell Switch语句演示打印水

仙花数:

帮助

01

$value=100..999

02

57 / 84

03

switch($value)

04

{

05

{[Math]::Pow($_%10,3)+[Math]::Pow( [Math]::Truncate($_%100/10) ,3)+[M

06

07

3) -eq

$_} {$_}

08

}

09

10

#153

#370

#371

Powershell 执行文件和脚本

Powershell, 程序设计 添加评论

十一 282011

象运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路

径,或者要运行的文件必须定义在可受信任的环境变量中。

关于脚本

脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器能够解释和执行的

命令行代码。

执行批处理文件

批处理是扩展名为”.bat”的文本文件,它可以包含任何cmd控制台能够处理的命令。当批

处理文件被打开,Cmd控制台会逐行执行每条命令。那Powershell能够直接执行批处理

吗?

将下列命令保存为

@echo off

echo batch

pause

Dir %windir%system

58 / 84

然后执行ping

屏幕会打印ping命令帮助,说明掉用的ping cmd 而不是。

改为:

59 / 84

这时运行的是批处理。

通过cmd进入cmd控制台输入ping发现执行的不是ping命令,而是直接运行 ,

也就是说可以通过.bat 覆盖cmd命令。这种机制很危险,如果有人侵入电脑,并将系统内

部命令篡改成自己批处理,那就太悲剧了。 这种命令与脚本的混淆不会发生在powershell

中,因为powershell有更安全的机制。

60 / 84

执行VB脚本文件

将下列命令保存为

Set wmi = GetObject("winmgmts:")

Set collection = ery("select * from

Win32_Process")

For Each process in collection

ectText_

Next

执行 . 会遍历当前Win32进程,并把每个进程的详细信息通过窗口显示出来。

怎样让VB脚本的通过控制台输出呢?

Wscript //H:CScript

怎样还原VB脚本通过窗口输出呢?

WScript //H:WScript

在powershell中执行VB脚本

61 / 84

62 / 84

执行powershell脚本

Powershell拥有自己的脚本,扩展名为“.ps1”

63 / 84

初次执行脚本时,可能会碰到一个异常:

File ” C:″ cannot be loaded because the

execution of scripts is disabled on this system. Please see

“get-help about_signing” for more details.

At line:1 char:10

+ .1 <<<<

这是powershell的默认安全设置禁用了执行脚本,要启用这个功能需要拥有管理员的权

限。

这里有详细解释:

Powershell调用入口的优先级

别名:控制台首先会寻找输入是否为一个别名,如果是,执行别名所指的命令。因此我们

可以通过别名覆盖任意powershell命令,因为别名的优先级最高。

函数:如果没有找到别名,会继续寻找函数,函数类似别名,只不过它包含了更多的

powershell命令。因此可以自定义函数扩充cmdlet 把常用的参数给固化进去。

命令:如果没有找到函数,控制台会继续寻找命令,即cmdlet,powershell的内部命令。

脚本:没有找到命令,继续寻找扩展名为“.ps1”的Powershell脚本。

文件:没有找到脚本,会继续寻找文件,如果没有可用的文件,控制台会抛出异常。

The term ‘now’ is not recognized as the name of a cmdlet, function, script file, or

operable program. Chec

g of the name, or if a path was included, verify that the path is correct and try again.

64 / 84

At line:1 char:4

+ now <<<<

+ CategoryInfo : ObjectNotFound: (now:String) [], CommandNotFoundException

+ FullyQualifiedErrorId : CommandNotFoundException

Powershell 执行外部命令

Powershell, 程序设计 添加评论

十一 242011

Powershell 能够像CMD一样很好的执行外部命令。

通过netstat查看网络端口状态

通过IPConfig查看自己的网络配置

65 / 84

66 / 84

route print查看路由信息

67 / 84

68 / 84

启动CMD控制台。

启动CMD控制台键入cmd或者,退出cmd可以通过命令exit。

查找可用的Cmd控制台命令

通过 /c 来接收命令参数,在Cmd中help可以查看可用的命令,所以可以通过

Cmd c help 查找可用的Cmd控制台命令

69 / 84

70 / 84

71 / 84

72 / 84

73 / 84

启动外部程序

为什么可以通过notpad打开记事本,不能通过wordpad打开写字板?

因为位于C:Windowssystem32 这个目录,而这个目录已经默认被包含在

Powershell的环境变量$env:Path中。

而 所在的”%ProgramFiles%Windows ”目录却

没有包含,可以先进入这个目录,再运行wordpad,或者将wordpad所在的目录加入到环

境变量中,$env:Path=$env:Path+”%ProgramFiles%Windows NTAccessories”。

默认键入一个字符串,powershell会将它原样输出,如果该字符串是一个命令或者启动程

序,在字符串前加‘&’可以执行命令,或者启动程序。

74 / 84

75 / 84

C

Powershell 命令集 cmdlets

Powershell, 程序设计 添加评论

十一 242011

cmdlets是Powershell的内部命令,cmdlet的

Info,包含下列属性和方法:

Name MemberType Definition

bool Equals( obj)

int GetHashCode()

type GetType()

string ToString()

dTypes CommandType {get;}

DefaultParameterSet {get;}

Definition {get;}

HelpFile {get;}

ImplementingType {get;}

leInfo Module {get;}

Equals Method

GetHashCode Method

GetType Method

ToString Method

CommandType Property

DefaultParameterSet Property

Definition Property

HelpFile Property

ImplementingType Property

Module

ModuleName

Name

Noun

OutputType

Property

Property

Property

Property

Property

类型名为

Parameters Property

ParameterSets

PSSnapIn

Verb

Visibility

DLL

HelpUri

Property

Property

ModuleName {get;}

Name {get;}

Noun {get;}

lyCollection`1[[

tion, Version=1.0.0.0, Culture=neutral, PublicKeyToke

{get;}

nary`2[[, mscorlib, Ver

PublicKeyToken=b77a5c561934e089],[te

tion, Version=1.0.0.0, Culture=neutral, PublicKeyTok

{get;}

lyCollection`1[[

tion, Version=1.0.0.0, Culture=neutral, P

ParameterSets {get;}

InInfo PSSnapIn {get;}

Property Verb {get;}

Property nStateEntryVisibility Visibility {get;set;}

ScriptProperty DLL {get=$on;}

HelpUri

{

ScriptProperty

# ok to cast CommandTypes enum to HelpCategory b

# cmdlet,function,filter,alias,externalscript

76 / 84

# it is ok to fail for other enum value

$helpObject = get-help -Name ($) -Category ([string]($dT

return first non-null uri (and try not to hit

if ($helpObject -eq $null) {

if ($ties['relatedLinks'] -eq $null)

if ($ties['navigationLink'] -eq $

$helpUri = [string]$( $tionLink | %{ if ($_.psobject.p

| ?{ $_ } | select

return

}

catch {};}

下面是全部的Cmdlets命令

每个命令有一个动词和名词组成,命令的作用一目了然。

Name

Add-Computer

Add-Content

Add-History

Add-Member

Add-PSSnapin

Add-Type

Checkpoint-Computer

Clear-Content

Clear-EventLog

Clear-History

Clear-Item

Clear-ItemProperty

Clear-Variable

Compare-Object

Complete-Transaction

Connect-WSMan

ConvertFrom-Csv

ConvertFrom-SecureString

ConvertFrom-StringData

Convert-Path

ConvertTo-Csv

ConvertTo-Html

ConvertTo-SecureString

ConvertTo-Xml

Copy-Item

Copy-ItemProperty

Debug-Process

Disable-ComputerRestore

Disable-PSBreakpoint

Disable-PSSessionConfiguration

Disable-WSManCredSSP

ModuleName Help

ment help

ment help

help

y help

help

y help

ment help

ment help

ment help

help

ment help

ment help

y help

y help

ment help

ment help

y help

ty help

y help

ment help

y help

y help

ty help

y help

ment help

ment help

ment help

ment help

y help

ment

help

help

77 / 84

Disconnect-WSMan

Enable-ComputerRestore

Enable-PSBreakpoint

Enable-PSRemoting

Enable-PSSessionConfiguration

Enable-WSManCredSSP

Enter-PSSession

Exit-PSSession

Export-Alias

Export-Clixml

Export-Console

Export-Counter

Export-Csv

Export-FormatData

Export-ModuleMember

Export-PSSession

ForEach-Object

Format-Custom

Format-List

Format-Table

Format-Wide

Get-Acl

Get-Alias

Get-AuthenticodeSignature

Get-ChildItem

Get-Command

Get-ComputerRestorePoint

Get-Content

Get-Counter

Get-Credential

Get-Culture

Get-Date

Get-Event

Get-EventLog

Get-EventSubscriber

Get-ExecutionPolicy

Get-FormatData

Get-Help

Get-History

Get-Host

Get-HotFix

Get-Item

Get-ItemProperty

Get-Job

ment help

ment help

y help

help

help

ment help

help

help

y help

y help

help

stics help

y help

y help

help

y help

help

y help

y help

y help

y help

ty help

y help

ty help

ment help

help

ment help

ment help

stics help

ty help

y help

y help

y help

ment help

y help

ty help

y help

help

help

y help

ment help

ment help

ment help

help

78 / 84

Get-Location

Get-Member

Get-Module

Get-PfxCertificate

Get-Process

Get-PSBreakpoint

Get-PSCallStack

Get-PSDrive

Get-PSProvider

Get-PSSession

Get-PSSessionConfiguration

Get-PSSnapin

Get-Random

Get-Service

Get-TraceSource

Get-Transaction

Get-UICulture

Get-Unique

Get-Variable

Get-WinEvent

Get-WmiObject

Get-WSManCredSSP

Get-WSManInstance

Group-Object

Import-Alias

Import-Clixml

Import-Counter

Import-Csv

Import-LocalizedData

Import-Module

Import-PSSession

Invoke-Command

Invoke-Expression

Invoke-History

Invoke-Item

Invoke-WmiMethod

Invoke-WSManAction

Join-Path

Limit-EventLog

Measure-Command

Measure-Object

Move-Item

Move-ItemProperty

New-Alias

ment help

y help

help

ty help

ment help

y help

y help

ment help

ment help

help

help

help

y help

ment help

y help

ment help

y help

y help

y help

stics help

ment help

ment help

ment help

y help

y help

y help

stics help

y help

y help

help

y help

help

y help

help

ment help

ment help

ment help

ment help

ment help

y help

y help

ment help

ment help

y help

79 / 84

New-Event

New-EventLog

New-Item

New-ItemProperty

New-Module

New-ModuleManifest

New-Object

New-PSDrive

New-PSSession

New-PSSessionOption

New-Service

New-TimeSpan

New-Variable

New-WebServiceProxy

New-WSManInstance

New-WSManSessionOption

Out-Default

Out-File

Out-GridView

Out-Host

Out-Null

Out-Printer

Out-String

Pop-Location

Push-Location

Read-Host

Receive-Job

Register-EngineEvent

Register-ObjectEvent

Register-PSSessionConfiguration

Register-WmiEvent

Remove-Computer

Remove-Event

Remove-EventLog

Remove-Item

Remove-ItemProperty

Remove-Job

Remove-Module

Remove-PSBreakpoint

Remove-PSDrive

Remove-PSSession

Remove-PSSnapin

Remove-Variable

Remove-WmiObject

y help

ment help

ment help

ment help

help

help

y help

ment help

help

help

ment help

y help

y help

ment help

ment help

ment help

y help

y help

y help

y help

y help

y help

y help

ment help

ment help

y help

help

y help

y help

help

ment help

ment help

y help

ment help

ment help

ment help

help

help

y help

ment help

help

help

y help

ment help

80 / 84

Remove-WSManInstance

Rename-Item

Rename-ItemProperty

ment help

ment help

ment help

Reset-ComputerMachinePassword ment help

Resolve-Path

Restart-Computer

Restart-Service

Restore-Computer

Resume-Service

Select-Object

Select-String

Select-Xml

Send-MailMessage

Set-Acl

Set-Alias

Set-AuthenticodeSignature

Set-Content

Set-Date

Set-ExecutionPolicy

Set-Item

Set-ItemProperty

Set-Location

Set-PSBreakpoint

Set-PSDebug

Set-PSSessionConfiguration

Set-Service

Set-StrictMode

Set-TraceSource

Set-Variable

Set-WmiInstance

Set-WSManInstance

Set-WSManQuickConfig

Show-EventLog

Sort-Object

Split-Path

Start-Job

Start-Process

Start-Service

Start-Sleep

Start-Transaction

Start-Transcript

Stop-Computer

Stop-Job

Stop-Process

ment help

ment help

ment help

ment help

ment help

y help

y help

y help

y help

ty help

y help

ty help

ment help

y help

ty help

ment help

ment help

ment help

y help

help

help

ment help

help

y help

y help

ment help

ment help

ment help

ment help

y help

ment help

help

ment help

ment help

y help

ment help

help

ment help

help

ment help

81 / 84

Stop-Service

Stop-Transcript

Suspend-Service

Tee-Object

Test-ComputerSecureChannel

Test-Connection

Test-ModuleManifest

Test-Path

Test-WSMan

Trace-Command

Undo-Transaction

Unregister-Event

ment help

help

ment help

y help

ment help

ment help

help

ment help

ment help

y help

ment help

y help

help

help

Unregister-PSSessionConfiguration

Update-FormatData y

Update-List

Update-TypeData

Use-Transaction

Wait-Event

Wait-Job

Wait-Process

Where-Object

Write-Debug

Write-Error

Write-EventLog

Write-Host

Write-Output

Write-Progress

Write-Verbose

Write-Warning

y help

y help

ment help

y help

help

ment help

help

y help

y help

ment help

y help

y help

y help

y help

y help

Powershell 进行数学运算

Powershell, 程序设计 添加评论

十一 242011

我们可以把powershell当成一个计算器。象键入命令行那样输入数学表达式,回车,

powershell会自动计算并把结果输出。常用的加减乘除模(+,-,*,/,%)运算和小括号表达

式都支持。

82 / 84

powershell也能自动识别计算机容量单位,包括KB,MB,GB,TB,PB

假如一个网站每个页面大小为80kb,统计显示每天的PV操作为800,1个月下来占用的

带宽:

83 / 84

假如一个网站的每天人均PV操作为5,页面大小为80Kb,主机提供商限制的总流量为

10G,那平均每天的最大访客数

为:

84 / 84


本文标签: 变量 命令 使用 脚本 对象