本文目录
Powershell 提供了一个非常特别的自动化变量,$ExecutionContext。这个变量可能会很少碰到,但是理解它的机制,有助于我们理解Powershell执行命令和脚本的内部机制。这个对象主要包含两个属性:InvokeCommand 和 SessionState.
PS E:> $ExecutionContext Host : System.Management.Automation.Internal.Host.InternalHost Events : System.Management.Automation.PSLocalEventManager InvokeProvider : System.Management.Automation.ProviderIntrinsics SessionState : System.Management.Automation.SessionState InvokeCommand : System.Management.Automation.CommandInvocationIntrinsics
InvokeCommand
到目前为止,我们在Powershell控制台中遇到三个比较特殊的字符,字符串标识双引号,调用操作符 &,和脚本块标识花括号。
| 特殊字符 | 定义 | 内部方法 |
| “ | 处理字符串中的变量 | ExpandString() |
| & | 执行命令集 | InvokeScript() |
| {} | 创建一个新的代码块 | NewScriptBlock() |
处理变量
每当你在Powershell的字符串中放置一个变量,Powershell解释器会自动处理该变量,并将变量替换成变量本身的值或者内容。
$site = '飞苔博客' # 双引号中的变量会被自动解析成变量的值: $text = "我的个人网站 $site" $text
输出:
我的个人网站 飞苔博客
既然双引号的机制是ExpandString()方法,那么也可以自己调用该方法
$site = '飞苔博客' # 双引号中的变量会被自动解析成变量的值: $text = '我的个人网站 $site' $text #通过ExpandString()自动处理字符串中的变量 $executioncontext.InvokeCommand.ExpandString($text)
输出:
我的个人网站 $site
我的个人网站 飞苔博客
创建脚本块
如果将Powershell代码放置在花括号中,这样既可以使用调用操作符&执行脚本,也可以将脚本块赋值给一个函数,因为之前的文章中说过,函数是一个命令的脚本块.
# 创建新的脚本块
$block = {
$write=Get-Process WindowsLiveWriter
"$($write.Name) 占用内存: $($write.WorkingSet/1mb) MB"
}
$block.GetType().Name
& $block
# 使用NewScriptBlock方法创建脚本块:
$blockStr='$write=Get-Process WindowsLiveWriter
"$($write.Name) 占用内存: $($write.WorkingSet/1mb) MB"'
$block = $executioncontext.InvokeCommand.NewScriptBlock($blockStr)
$block.GetType().Name
& $block
输出:
ScriptBlock
WindowsLiveWriter 占用内存: 150.734375 MB
ScriptBlock
WindowsLiveWriter 占用内存: 150.734375 MB
执行命令行
输入的命令行可以通过InvokeScript()脚本执行,也可以使用&执行,也可以使用Invoke-Expression命令执行
$cmd='3*3*3.14'
& { 3*3*3.14}
$executioncontext.InvokeCommand.InvokeScript($cmd)
Invoke-Expression $cmd
输出:
28.26
28.26
28.26
SessionState
SessionState是一个用来表现Powershell环境的对象,你同样可以通过自动化变量$ExecutionContext访问这些信息.
PS E:> $executioncontext.SessionState | Format-List *
Drive : System.Management.Automation.DriveManagementIntrinsics
Provider : System.Management.Automation.CmdletProviderManagementIntrinsics
Path : System.Management.Automation.PathIntrinsics
PSVariable : System.Management.Automation.PSVariableIntrinsics
LanguageMode : FullLanguage
UseFullLanguageModeInDebugger : False
Scripts : {*}
Applications : {*}
Module :
InvokeProvider : System.Management.Automation.ProviderIntrinsics
InvokeCommand : System.Management.Automation.CommandInvocationIntrinsics
PSVariable,可以取出和更新Powershell中所有的变量.
$value = "Test"
# Retrieve variable contents:
$executioncontext.SessionState.PSVariable.GetValue("value")
Test
# Modify variable contents:
$executioncontext.SessionState.PSVariable.Set("value", 100)
$value
100
输出:
Powershell博客 飞苔博客
Powershell博客 网站http://www.mossfly.com
管理驱动器
查看当前驱动器信息
PS E:> $executioncontext.SessionState.Drive.Current Name Used (GB) Free (GB) Provider Root CurrentLocation ---- --------- --------- -------- ---- --------------- E 1.67 78.33 FileSystem E:
查看所有驱动器信息
PS E:> $executioncontext.SessionState.Drive.GetAll() | ft - Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- WSMan WSMan Alias Alias Env Environment C 44.48 35.52 FileSystem C: D 18.69 52.16 FileSystem D: E 1.67 78.33 FileSystem E: G 52.57 118.55 FileSystem G: I 27.31 21.52 FileSystem I: Function Function HKLM Registry HKEY_LOCAL_MACHINE HKCU Registry HKEY_CURRENT_USER Variable Variable cert Certificate F FileSystem F: H .67 FileSystem H:
如果你的只想关注特定的驱动器,可以使用下面的方法:
PS E:> $executioncontext.SessionState.Drive.GetAllForProvider("FileSystem")
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
C 44.48 35.52 FileSystem C: Usersbaozhen
D 18.69 52.16 FileSystem D:
E 1.67 78.33 FileSystem E:
G 52.57 118.55 FileSystem G:
I 27.31 21.52 FileSystem I:
F FileSystem F:
H .67 FileSystem H:
路径操作
SessionState的Path包含几个特殊的方法,基本可以覆盖各种常用的路径操作了
| 方法 | 描述 | 对应的命令 |
| CurrentLocation | 当前路径 | Get-Location |
| PopLocation() | 获取存储的路径 | Pop-Location |
| PushCurrentLocation() | 存储路径 | Push-Location |
| SetLocation() | 定位路径 | Set-Location |
| GetResolvedPSPathFromPSPath() | 相对路径转换成绝对路径 | Resolve-Location |
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
