powershell完全学习手册.docx
《powershell完全学习手册.docx》由会员分享,可在线阅读,更多相关《powershell完全学习手册.docx(42页珍藏版)》请在冰豆网上搜索。
powershell完全学习手册
Powershell定义变量
Powershell,程序设计 添加评论
十二052011
变量可以临时保存数据,因此可以把数据保存在变量中,以便进一步操作。
帮助
01
02
03
04
05
06
07
08
09
10
11
#定义变量
$a=10
$b=4
#计算变量
$result=$a*$b
$msg="保存文本"
#输出变量
$result
$msg
40
保存文本
powershell不需要显示地去声明,可以自动创建变量,只须记住变量的前缀为$.
创建好了变量后,可以通过变量名输出变量,也可以把变量名存在字符串中。
但是有个例外单引号中的字符串不会识别和处理变量名。
选择变量名
在powershell中变量名均是以美元符”$”开始,剩余字符可以是数字、字母、下划线的任意字符,并且powershell变量名大小写不敏感($a和$A是同一个变量)。
某些特殊的字符在powershell中有特殊的用途,一般不推荐使用这些字符作为变量名。
当然你硬要使用,请把整个变量名后缀用花括号括起来。
赋值和返回值
赋值操作符为“=”,几乎可以把任何数据赋值给一个变量,甚至一条cmdlet命令
,为什么,因为Powershell支持对象,对象可以包罗万象。
给多个变量同时赋值
赋值操作符不仅能给一个变量赋值,还可以同时给多个变量赋相同的值。
交换变量的值
要交换两个变量的值,传统的程序语言至少需要三步,并且还需定义一个中间临时变量。
在powershell中,交换两个变量的值,这个功能变得非常简单。
查看正在使用的变量
Powershell将变量的相关信息的记录存放在名为variable:
的驱动中。
如果要查看所有定义的变量,可以直接遍历variable:
查找变量
因为有虚拟驱动variable:
的存在,可以象查找文件那样使用通配符查找变量。
例如要查询以value打头的变量名。
验证变量是否存在
验证一个变量是否存在,仍然可以象验证文件系统那样,使用cmdletTest-Path。
为什么?
因为变量存在变量驱动器中。
删除变量
因为变量会在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选项在创建变量时,给变量加上只读属性,这样就不能给变量重新赋值了。
但是可以通过删除变量,再重新创建变量更新变量内容。
有没有权限更高的变量,有,那就是:
选项Constant,常量一旦声明,不可修改
变量描述
在New-Variable可以通过-description添加变量描述,但是变量描述默认不会显示,可以通过Format-List查看。
Powershell自动化变量
Powershell,程序设计 添加评论
十二072011
Powershell自动化变量是那些一旦打开Powershell就会自动加载的变量。
这些变量一般存放的内容包括
用户信息:
例如用户的根目录$home
配置信息:
例如powershell控制台的大小,颜色,背景等。
运行时信息:
例如一个函数由谁调用,一个脚本运行的目录等。
powershell中的某些自动化变量只能读,不能写。
例如:
$Pid。
可以通过Get-Helpabout_Automatic_variables查看Automatic_variables的帮助。
TOPIC
about_Automatic_Variables
主题
about_Automatic_Variables
简短说明
说明存储WindowsPowerShell状态信息的变量。
这些变量由WindowsPowerShell创建并维护。
详细说明
下面是WindowsPowerShell中的自动变量的列表:
$$
包含会话所收到的最后一行中的最后一个令牌。
$?
包含最后一个操作的执行状态。
如果最后一个操作成功,则包含TRUE,失败则包含FALSE。
$^
包含会话所收到的最后一行中的第一个令牌。
$_
包含管道对象中的当前对象。
在对管道中的每个对象或所选对象执行操作的命令中,可以使用此变量。
$Args
包含由未声明参数和/或传递给函数、脚本或脚本块的参数值组成的数组。
在创建函数时可以声明参数,方法是使用param关键字或在函数名称后添加以圆括号括起、逗号
分隔的参数列表。
$Console
包含在会话中最近使用的控制台文件(.psc1)的路径。
在通过PSConsoleFile参数启动
WindowsPowerShell或使用Export-Consolecmdlet将管理单元名称导出到控制台文件
时,将填充此变量。
在使用不带参数的Export-Consolecmdlet时,它自动更新在会话中最近使用的控制台文件。
可以使用此自动变量确定要更新的文件。
$Error
包含错误对象的数组,这些对象表示最近的一些错误。
最近的错误是该数组中的第一个错误对象
($Error[0])。
$Event
包含一个PSEventArgs对象,该对象表示一个正在被处理的事件。
此变量只在事件注册命令(例如Register-ObjectEvent)的Action块内填充。
此变量的值是Get-Eventcmdlet返回的同一个对象。
因此,可以在Action脚本块中使用$Event变量的属性(例如
$Event.TimeGenerated)。
$EventSubscriber
包含一个PSEventSubscriber对象,该对象表示正在被处理的事件的事件订阅者。
此变量只在事件注册命令的Action块内填充。
此变量的值
是Get-EventSubscribercmdlet返回的同一个对象。
$ExecutionContext
包含一个EngineIntrinsics对象,该对象表示WindowsPowerShell主机的执行上下文。
可以使用此变量来查找可用于cmdlet的执行对象。
$False
包含FALSE。
可以使用此变量在命令和脚本中表示FALSE,而不是使用字符串”false”。
如果
该字符串转换为非空字符串或非零整数,则可将该字符串解释为TRUE。
$ForEach
包含ForEach-Object循环的枚举数。
可以对$ForEach变量的值使用枚举数的属性和方法。
此变量仅在运行For循环时存在,循环完成即会删除。
$Home
包含用户的主目录的完整路径。
此变量等效于%homedrive%%homepath%环境变量。
$Host
包含一个对象,该对象表示WindowsPowerShell的当前主机应用程序。
可以使用此变量在命
令中表示当前主机,或者显示或更改主机的属性,如$Host.version、$Host.CurrentCulture
或$host.ui.rawui.setbackgroundcolor(“Red”)。
$Input
一个枚举数,它包含传递给函数的输入。
$Input变量区分大小写,只能用于函数和脚本块。
(脚
本块本质上是未命名的函数。
)在函数的Process块中,$Input变量包含当前位于管道中的对
象。
在Process块完成后,$Input的值为NULL。
如果函数没有Process块,则$Input
的值可用于End块,它包含函数的所有输入。
$LastExitCode
包含运行的最后一个基于Windows的程序的退出代码。
$Matches
$Matches变量与-match和-notmatch运算符一起使用。
将标量输入提交给-match或-notmatch运算符时,如果检测到匹配,则会返回一个布尔值,
并使用由所有匹配字符串值组成的哈希表填充$Matches自动变量。
有关-match运算符的详细
信息,请参阅about_comparison_operators。
$MyInvocation
包含一个对象,该对象具有有关当前命令(如脚本、函数或脚本块)的信息。
可以使用该对象中的
信息(如脚本的路径和文件名($myinvocation.mycommand.path)或函数的名称
($myinvocation.mycommand.name))来标识当前命令。
对于查找正在运行的脚本的名称,这非常有用。
$NestedPromptLevel
包含当前提示级别。
值0指示原始提示级别。
该值在进入嵌套级别时递增,在退出嵌套级别时递减。
例如,在使用$Host.EnterNestedPrompt方法时,WindowsPowerShell会出现嵌套命令
提示符。
在WindowsPowerShell调试程序中到达断点时,WindowsPowerShell也会出现嵌
套命令提示符。
在进入嵌套提示时,WindowsPowerShell暂停当前命令,保存执行上下文,并递增
$NestedPromptLevel变量的值。
要创建更多嵌套命令提示符(最多128级)或返回到原始命
令提示符,请完成命令,或键入”exit”。
$NestedPromptLevel变量有助于跟踪提示级别。
可以创建包含此值的备用Windows
PowerShell命令提示符,以使此值始终可见。
$NULL
包含NULL或空值。
可以在命令和脚本中使用此变量表示NULL,而不是使用字符串”NULL”。
如果该字符串转换为非空字符串或非零整数,则可将该字符串解释为TRUE。
$PID
包含承载当前WindowsPowerShell会话的进程的进程标识符(PID)。
$Profile
包含当前用户和当前主机应用程序的WindowsPowerShell配置文件的完整路径。
可以在命令
中使用此变量表示配置文件。
例如,可以在命令中使用此变量确定是否已创建某个配置文件:
test-path$profile
也可以在命令中使用此变量创建配置文件:
new-item-type$pshome-force
此外,还可以在命令中使用此变量在记事本中打开配置文件:
notepad$profile
$PSBoundParameters
包含活动参数及其当前值的字典。
只有在声明参数的作用域(如脚本或函数)中,
此变量才有值。
可以使用此变量显示或更改参数的当前值,也可以将参数值传递给
其他脚本或函数。
例如:
functiontest{
param($a,$b)
#Displaytheparametersindictionaryformat.
$psboundparameters
#CalltheTest1functionwith$aand$b.
test1@psboundparameters
}
$PsCmdlet
包含一个对象,该对象表示正在运行的cmdlet或高级函数。
可以在cmdlet或函数代码中使用该对象的属性和方法来响应使用的条件。
例如,
ParameterSetName属性包含正在使用的参数集的名称,而ShouldProcess方法将WhatIf
和Confirm参数动态添加到cmdlet。
有关$PSCmdlet自动变量的详细信息,请参阅about_Functions_Advanced。
$PsCulture
包含操作系统中当前所用的区域性的名称。
区域性确定数字、货币和日期等项的显示格式。
这是系
统的System.Globalization.CultureInfo.CurrentCulture.Name属性的值。
要获取系统
的System.Globalization.CultureInfo对象,请使用Get-Culturecmdlet。
$PSDebugContext
在调试期间,此变量包含有关调试环境的信息。
在其他时间,此变量包含NULL值。
因此,可以使
用此变量指示调试程序是否拥有控制权。
填充之后,此变量包含一个具有Breakpoints和
InvocationInfo属性的PsDebugContext对象。
InvocationInfo属性有多个十分有用的
属性,包括Location属性。
Location属性指示正在调试的脚本的路径。
$PsHome
包含WindowsPowerShell的安装目录的完整路径(通常为
%windir%\System32\WindowsPowerShell\v1.0)。
可以在WindowsPowerShell文件
的路径中使用此变量。
例如,下面的命令在概念性帮助主题中搜索”variable”一词:
select-string-patternvariable-path$pshome\*.txt
$PSScriptRoot
包含要从中执行脚本模块的目录。
通过此变量,脚本可以使用模块路径来访问其他资源。
$PsUICulture
包含操作系统中当前所用的用户界面(UI)区域性的名称。
UI区域性确定哪些文本字符串用于用户
界面元素(如菜单和消息)。
这是系统的
System.Globalization.CultureInfo.CurrentUICulture.Name属性的值。
要获取系统
的System.Globalization.CultureInfo对象,请使用Get-UICulturecmdlet。
$PsVersionTable
包含一个只读哈希表,该哈希表显示有关在当前会话中运行的WindowsPowerShell版本的详
细信息。
该表包括下列项:
CLRVersion:
公共语言运行时(CLR)的版本
BuildVersion:
当前版本的内部版本号
PSVersion:
WindowsPowerShell版本号
WSManStackVersion:
WS-Management堆栈的版本号
PSCompatibleVersions:
与当前版本兼容的WindowsPowerShell版本
SerializationVersion序列化方法的版本
PSRemotingProtocolVersion
WindowsPowerShell远程管理协议的版本
$Pwd
包含一个路径对象,该对象表示当前目录的完整路径。
$Sender
包含生成此事件的对象。
此变量只在事件注册命令的Action块内填充。
此变量的值也可在Get-Event返回的PSEventArgs
(System.Management.Automation.PSEventArgs)对象的Sender属性中找到。
$ShellID
包含当前shell的标识符。
$SourceArgs
包含表示正在被处理的事件的事件参数的对象。
此变量只在事件注册命令的Action
块内填充。
此变量的值也可在Get-Event返回的PSEventArgs
(System.Management.Automation.PSEventArgs)对象的SourceArgs属性中找到。
$SourceEventArgs
包含一个对象,该对象表示从正在被处理的事件的EventArgs中派生出的
第一个事件参数。
此变量只在事件注册命令的Action块内填充。
此变量的值也可在Get-Event返回的PSEventArgs
(System.Management.Automation.PSEventArgs)对象的SourceArgs属性中找到。
$This
在定义脚本属性或脚本方法的脚本块中,$This变量引用要扩展的对象。
$True
包含TRUE。
可以在命令和脚本中使用此变量表示TRUE。
另请参阅
about_Hash_Tables
about_Preference_Va
riables
about_Variables
Powershell通过函数扩展别名
Powershell,程序设计 添加评论
十一252011
在Powershell中设置别名的确方便快捷,但是在设置别名的过程中并设置参数的相关信息。
尽管别名会自动识别参数,但是如何把经常使用的参数默认设定在别名里面呢?
例如Test-Connection-Count2-ComputerName,让-”-Count2″固化在别名中。
这时简单的别名无法完成上述需求,可以通过函数来完成它,并且一旦把函数拉过来,定义别名会变得更加灵活。
有了函数牵线,别名可以完成更高级更强大的功能,其中$args为参数的占位符,经测试,发现这个占位符必须以$args命名,否则不能识别,会抛出异常:
Cannotvalidateargumentonparameter‘ComputerName’.Theargumentisnullorempty.Supplyanarg
ntthatisnotnulloremptyandthentrythecommandagain.
Powershell快速编辑模式和标准模式
Powershell,程序设计 添加评论
十一232011
powershell控制台有两种模式,一个是快速编辑模式,一个是标准模式。
快速编辑模式和标准模式的切换可以通过控制台标题栏->鼠标右击->属性->选项->编辑选项。
powershell标准模式
鼠标右击选择标记后才能实现复制和粘切功能。
powershell快速编辑模式
可以通过鼠标右键选择任意矩形区域内的文本,并且鼠标右击实现复制功能。
Powershell自定义控制台
Powershell,程序设计 添加评论
十一232011
右击标题栏选择”属性”弹出powershell控制台对话框。
在这里有三个四个选项卡:
选项、字体、布局和颜色。
“选项”设置光标,历史记录,编辑模式的切换。
“字体”设置字体的名称和大小
“布局”设置窗口的缓冲区、窗口的大小、窗口起始坐标
“颜色”设置屏幕和对话框的背景色和前景色。
PowershellForeach循环
Powershell,程序设计 添加评论
一232012
Foreach-object为cmdlet命令,使用在管道中,对管道结果逐个处理,foreach为遍历集合的关键字。
下面举两个例子:
帮助
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
$array=7..10
foreach($nin$array)
{
$n*$n
}
#49
#64
#81
#100
foreach($dirc:
\windows)
{
if($-gt1mb)
{
$
}
}
#explorer.exe
#WindowsUpdate.log
这里只为了演示foreach,其实上面的第二个例子可以用Foreach-Object更简洁。
Powershell条件操作符
Powershell,程序设计 添加评论
一162012
Powershell中的比较运算符
-eq:
等于
-ne:
不等于
-gt:
大于
-ge:
大于等于
-lt:
小于
-le:
小于等于
-contains:
包含
-notcontains:
不包含
进行比较
可以将比较表达式直接输入进Powershell控制台,然后回车,会自动比较并把比较结果返回。
求反
求反运算符为-not但是像高级语言一样”!
“也支持求反。
布尔运算
-and:
和
-or:
或
-xor:
异或
-not:
逆
比较数组和集合
过滤数组中的元素
验证一个数组是否存在特定元素
PowershellWhere-Object条件过滤
Powershell,程序设计 添加评论
一172012
本篇会对条件判断进行实际应用。
在管道中可以通过条件判断过滤管道结果,Where-Object会对集合逐个过滤,将符合条件的结果保留。
过滤管道结果
使用Get-Process返回所有的当前进程,但是你可能并不对所有的进程感兴趣,然后通过每个Process对象的属性进行过滤。
首先得知道每个对象支持那些属性。
根据进程名过滤所有记事本进程。
根据进程名过滤所有IE进程。
根据company过滤所有产品发布者以”Microsoft”打头的进程:
使用别名
因为Where-Object的使用概率比较高,所以有一个很形象的别名?
可以使用:
PowershellForEach-Object循环
Powershell,程序设计 添加评论
一222012
Powershell管道就像流水线,对于数据的处理是一个环节接着一个环节,如果你想在某一环节对流进来的数据逐个细致化的处理,可是使用ForEach-Object,$_代表当前的数据。
对管道对象逐个处理
如果使用Get-WmiObject获取系统中的服务,为了排版可能会也会使用Format-Table对结果进行表格排版。
但是如果想对每个服务进行更定制化的处理可是使用ForEach-Object
结合条件处理
ForEach-Object的处理可以包含任意Powershell脚本,当然也包括条件语句
帮助
1
2
3
4
Get-WmiObjectWin32_Service|ForEach-Object{
if($_.ProcessId-gt3000)
{"{0}({1})"-f$_.DisplayName,$_.ProcessID}
}
调用方法
在ForEach-Object中,$_代表当前对象,当然也允许