首页 | 网页设计 | w3c标准 | flash动画 | 平面设计 | 经典文章 | 特约专题 | 资源下载 | 健康频道 | 重庆品牌网站 | 留言簿 | 
技术文章  资源下载 经典素材  社区论坛
   
 您现在的位置: vi设计在线 >> 经典文章 >> ccqvi动态 >> 技术应用 >> 正文  
  最新IT信息-Windows PowerShell 2.0 之Shell环境及配置         
[ 作者:佚名    转贴自:本站原创    点击数:1460    更新时间:2010/7/12    文章录入:diyinetwork ]

减小字体 增大字体

Windows PowerShell 2.0 之Shell环境及配置

重庆帝一网络建设专家 http://www.diy88.com.cn

PoweShell提供了大量可定制选项,用户可以选择更改变量和函数来实现这一切。这一文将会描述如何获取Shell环境的设置,以及如何配置Shell最常用的选项。其中将会涉及初始化脚本和当前用户配置脚本,这些配置允许用户保存配置相关的代码,为所有Shell的实例执行这些配置。最后将会展示在创建提示字符串时或查找字符串自动匹配当前命令时,Shell如何调用用户代码。

除了能够灵活地自定义外,PoweShell在设计时考虑了便于用户自定义脚本的机制。用户的脚本代码能够运行在多种不同类型的PoweShell脚本宿主下,这样就可以提供各种高级特性。读者将会学习到如何设置特定Shell宿主的配置选项,并设立单独的配置文件。通过增加宿主特定的配置文件,用户能够使用配置文件调用宿主强大的功能。

1 Shell主机

PoweShell.exe程序是个基于命令行的应用,不同的Shell允许用户将命令行Shell作为控制台程序来使用。PoweShell的官方开发文档提出没有代码运行在控制台环境下,并且永远不要直接输出文本到控制台。因为这样做会很容易地在程序中内嵌Shell,内嵌到PoweShell中的程序称为“Shell宿主”。它们可以是任何的程序,包括GUI工具、服务,甚至是运行在远程主机上的程序。

让自己的程序作为PoweShell宿主的常见原因一是为了提供比PoweShell更好的Shell操作体验,包括更好的命令自动补全、更强大的调试功能,以及可视化;二是重用Shell的服务(提供程序和cmdlet等)。新的Windows管理模型(Microsoft Windows Administration Model)要求管理员工具不能直接修改系统状态,取而代之的是由此类工具生成起实际作用的PoweShell脚本。这样做的好处是初学者可以保存并重新执行这些脚本,或在其他机器上多次执行。

PoweShell将Shell宿主暴露在代码前,这样运行在Shell中的代码可以相互通信并很容易获取宿主和环境的信息,如查询主机名并用于用户界面相关的服务中。下例获取宿主对象及其提供的内容,其中使用了$host全局变量:

PS C:\> $host

Name             : ConsoleHost
Version          : 2.0
InstanceId       : 725fab6a-dfe4-4589-8373-a3e7354c8b1d
UI               : System.Management
.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : zh-CN
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.
ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.
Automation.Runspaces.LocalRunspace

另外一种获取宿主对象的方法是调用Get-Host这个cmdlet,两种调用方法的实质均为调用Get-Host,不同是$host是Get-Host的简写形式。在上例中,可以看到获得的默认实例是提供基础宿主服务的Microsoft.PowerShell.ConsoleHost对象。可以查询宿主对象,并使用提供的信息来发现当前代码在哪个宿主下运行,如宿主程序的名称和版本。

宿主对象提供的最重要的服务是与UI相关的操作,UI的入口点(entry point)是$host.UI的属性。它返回PsHostUserInterface对象,该对象表明了提供给脚本和cmdlet的宿主本质联系。下例使用PSHostUserInrerface方法:

PS C:\> $host.UI | Get-Member -type Method


   TypeName: System.Management.
Automation.Internal.Host.InternalHostUserInterface

Name                   MemberType Definition
----                   ---------- ----------
Equals                 Method     
System.Boolean Equals(Object obj)
GetHashCode            Method     
System.Int32 GetHashCode()
GetType                Method     
System.Type GetType()
Prompt                 Method    
 System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0,...
PromptForChoice        Method     
System.Int32 PromptForChoice
(String caption, String message, Collection`1 choices,...
PromptForCredential    Method     
System.Management.Automation.
PSCredential PromptForCredential
(String caption, Stri...
ReadLine               Method     
System.String ReadLine()
ReadLineAsSecureString Method     
System.Security.SecureString ReadLineAsSecureString()
ToString               Method     
System.String ToString()
Write                  Method    
 System.Void Write(String value), 
System.Void Write(ConsoleColor foregroundColor, C...
WriteDebugLine         Method     
System.Void WriteDebugLine(String message)
WriteErrorLine         Method    
 System.Void WriteErrorLine(String value)
WriteLine              Method     
System.Void WriteLine(), System.Void WriteLine
(String value), System.Void WriteLin...
WriteProgress          Method     
System.Void WriteProgress(Int64 sourceId, 
ProgressRecord record)
WriteVerboseLine       Method     
System.Void WriteVerboseLine(String message)
WriteWarningLine       Method     
System.Void WriteWarningLine(String message)

该方法提示并读取用户输入,返回写正常的输出、诊断及进程信息,用户可以直接调用这些方法:

PS C:\> $host.UI.WriteLine("Hello world")
Hello world

PSHostUserInterface对象为作用于Shell宿主提供了高层次的函数,它是PSHostRawUserInterface类型的对象,可以提供Shell窗口物理操作方法的途径,包括字符缓冲区、窗体属性,以及文字前景和背景颜色等。下例会得到更多有用的属性:

PS C:\> $host.UI.RawUI

ForegroundColor       : DarkYellow
BackgroundColor       : DarkMagenta
CursorPosition        : 0,3
WindowPosition        : 0,0
CursorSize            : 25
BufferSize            : 120,2000
WindowSize            : 120,46
MaxWindowSize         : 120,46
MaxPhysicalWindowSize : 128,46
KeyAvailable          : False
WindowTitle           : 
Administrator: Windows PowerShell V2 (CTP3)

可以使用PSHostUserInterface对象修改Shell进程,设置自定义的颜色。如将Windows Vista设置为经典的Borland IDE黄字蓝色背景,则执行如下操作:

PS C:\> $Host.UI.RawUI.BackgroundColor = "blue"
PS C:\> $Host.UI.RawUI.ForegroundColor = "yellow"
PS C:\> Clear-Host

执行第1条命令后字符所在区域的背景变为蓝色,执行第2条命令后文字颜色变为黄色,第3条命令用来强制重绘整个控制台缓冲区。

下面使用RawUI修改窗口的大小和标题:

PS C:\> $size = $host.UI.RawUI.WindowSize
PS C:\> $size.Width = 350
PS C:\> $size.Height = 270
PS C:\> $host.UI.RawUI.WindowSize = $size
PS C:\> $host.UI.RawUI.WindowTitle = "RawUI Title!!"

需要强调的是修改窗口大小的操作,直接设置$host.UI.RawUI.WindowSize.Width和$host.UI.RawUI.WindowsSize.Height属性无法触发用户界面更新,只有设置WindoowsSize属性后宿主才更新UI窗口。所以在上例中获取原始WindowSize的引用并修改,然后将引用反向赋值给原始对象。这样触发了窗口更新,窗口大小改变并修改了窗口标题。

2 用户配置脚本

可以通过在配置文件脚本(安放在特定位置的脚本,Shell在每次执行时调用)中保存配置代码并在每个控制台进程中使用。PoweShell提供了多种选项用于保存配置脚本,根据需要可以定制不同的配置脚本。

2.1 设置所有用户和Shell

所有的Shell设置保存在PowerShell安装路径中的profile.ps1文件中,可以使用$PSHome变量来获取PowerShell的安装路径:

PS C:\> $PSHome
C:\Windows\system32\WindowsPowerShell\v1.0\

下面在这个配置文件中添加语句:

PS C:\> $code = "Write-Host 'Hello World to all users and shells'"
PS C:\> Add-Content $PSHome\profile.ps1 $code

因为修改的是系统文件夹中的文件,所以需要具有管理员权限及更改文件执行权限(如果运行在Windows Vista系统下)。

2.2 设置所有用户使用的特定Shell

为了创建所有用户使用的特定Shell的配置文件,在PoweShell的安装目录中放置一个文件。根据惯例,其命名规则为_profile.ps1。如果是默认Shell宿主,则文件名为“Microsoft.PowerShell_profile.ps1”。下例为所有用户运行默认Shell宿主时增加设置:

PS C:\> $code = "Write-Host 'Hello World to all users of default shells'"
PS C:\> Add-Content $PSHome\Microsoft.PowerShell_profile.ps1 $code
PS C:\>

这里同样也需要使用管理员权限运行这些代码。

通过查询PowerShell的$ShellID变量即可找到任意Shell宿主的ShellID值:

PS C:\> $ShellId
Microsoft.PowerShell

2.3 设置特定用户和所有Shell

为特定用户保存所有的Shell配置也需要创建profile.ps1文件,在Windows Vista中该文件需要放置在C:\Users\\Documents\WindowsPowerShell中;在支持PowerShell的早期Windows版本,如Windows XP中,WindowsPowerShell目录放置在My Documents文件夹中。下例为特定用户的Shell添加配置:

PS C:\> $code = "Write-Host 'Hello , 
Administrator, this is for your all shells'"
PS C:\> $userProfileDir = "C:\Users\ 
Administrator \Documents\WindowsPowerShell"
PS C:\> Add-Content $userProfileDir\profile.ps1 $code

这里只是修改了特定用户的配置文件,执行不再需要管理员权限,而只需要对应的用户权限。

2.4 设置特定用户和特定Shell

为特定用户设置的特定Shell配置文件应放置在用户Document文件夹的WindowsPowerShell目录中。在Windows Vista下,当前特定用户的特定Shell配置文件放置在C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_ profile.ps1。PowerShell中提供了获取这个路径的快捷方式,即$profile变量,如:

PS C:\> $PROFILE
C:\Users\Administrator\Documents\WindowsPowerShell
\Microsoft.PowerShell_profile.ps1
PS C:\> $code = "Write-Host 'Hello , 
Administrator, this is for your only this shells'"
PS C:\> Add-Content $profile $code

其中的Add-Content用于在配置脚本文件中添加代码,用其不必使用notepad.exe之类的文本编辑器打开文件并添加内容。

所有用户的启动配置均放在All Users文件夹或者注册表项中,特定用户的启动项放在用户的启动文件夹或注册表HKEY_CURRENT_USER主键的相应启动项中,启动时全局用户的启动项加载进度会早于特定用户。同样所有用户的配置脚本通常用于管理员视图,这样管理员可以向所有Shell推送设置。因为全局设置需要管理员权限,所以管理员设置后其他用户无法更改;而个人设置通常针对用户本人,可以为不同权限的Shell设置不同的个性化配置。如果用户没有注意到启动的Shell以何种权限存在,可以通过不同的个性化配置判断。如果在上面4个位置设置了不同的配置文件,则在当前用户启动一个Shell时会输出以下内容:

Hello World to all users and shells
Hello World to all users of default shells
Hello , Administrator, this is for your all shells
Hello , Administrator, this is for your only this shells
PS C:\>

3 使用已保存控制台配置工作

PoweShell可用自定义的管理单元(Snap-in)扩展功能,管理单元是.NET的框架。它通常以动态链接库(DLL)文件的形式存在,其中包含cmdlet和提供程序(provider)。在Internet上已经存在大量有用的扩展,而且相当一部分很流行。使用管理单元的过程如下。

(1)注册管理单元:需要管理员权限来提高权限,并且通常由管理单元安装程序完成。

(2)在当前Shell进程中包含管理单元:在管理单元中使用cmdlet或者提供程序,用户必须使用Add-PSSnapIn这个cmdlet将管理单元添加到当前Shell进程中。

下例添加PSEventing管理单元(由于本书中采用不包含任何管理单元的PowerShell 2.0版本,因此为了演示Add-PSSnapIn,该例在1.0的版本中执行),其中包含PowerShell事件库的cmdlet:

PS C:\> Add-PSSnapIn PSEventing
PS C:\>

下面可以确认管理单元已经被加载到当前的Shell进程中,调用Get-PSSnapIn这个cmdlet:

PS C:\> Get-PSSnapIn

Name        : Microsoft.PowerShell.Core
PSVersion   : 1.0
Description : This Windows PowerShell snap-in 
contains Windows PowerShell management
 cmdlets used to manage components
              of Windows PowerShell.

Name        : Microsoft.PowerShell.Host
PSVersion   : 1.0
Description : This Windows PowerShell snap-in 
contains cmdlets used by the Windows PowerShell host.

Name        : Microsoft.PowerShell.Security
PSVersion   : 1.0
Description : This Windows PowerShell snap-in 
contains cmdlets to manage Windows PowerShell security.

Name        : Microsoft.PowerShell.Utility
PSVersion   : 1.0
Description : This Windows PowerShell snap-in 
contains utility Cmdlets used to manipulate data.

Name        : PSEventing
PSVersion   : 1.0
Description :PowerShell Eventing Library 1.0.

列表中首先显示PowerShell中内置的管理单元,最后显示新添加的PSEventing管理单元。

4 改变提示设置

现有的Shell,包括cmd.exe和Unix的Shell均有改变提示字符串(在命令执行前显示在命令前的部分)的相应机制,即允许用户通过设置全局变量或环境变量更改提示符。如cmd.exe中默认的提示符格式为$Location>,它代表当前所在的驱动器和目录。其后跟大于号(>),如C:\PowerShell>。

PowerShell的Shell提示符通过全局函数实现,用户能定义函数并返回任何需要的提示符,这样使用PowerShell本身的语言即可扩展提示符;另外这种机制有很好的扩展性,因为返回值取决于任何在PowerShell中起作用的工具。

首先通过查看提示符函数的定义了解默认提示符值的组成:

PS C:\> (dir Function:\Prompt).Definition
$(if (test-path variable:/PSDebugContext) { '[DBG]: ' } 
else { '' }) + 'PS ' + $(Get-Location) + $(if ($nestedpromptlev
el -ge 1) { '>>' }) + '> '

下面尝试创建包含当前用户名的提示符,为了获取当前用户,需要调用.NET 框架的API返回当前Windows身份对象。这里会封装一个Get-User函数,代码如下:

PS C:\> function Get-User
>> {
>>     [System.Security.Principal.
WindowsIdentity]::GetCurrent()
>> }
>>
PS C:\> Get-User

AuthenticationType : NTLM
ImpersonationLevel : None
IsAuthenticated    : True
IsGuest            : False
IsSystem           : False
IsAnonymous        : False
Name               : WIN-SJW3NR55BHE\Administrator
Owner              : S-1-5-32-544
User               : S-1-5-21-926212464-
3120188763-1019539477-500
Groups             : {S-1-5-21-926212464-
3120188763-1019539477-513, S-1-1-0, 
S-1-5-32-544, S-1-5-32-545...}
Token              : 2024

使用封装后的函数创建自定义的提示符:

PS C:\> function prompt
>> {
>>     $user = (Get-User).Name
>>     $path = Get-Location
>>     “[$user]$path>”
>> }
>>
[WIN-SJW3NR55BHE\Administrator]C:\>

可以通过用户对象来配置命令提示符为类Unix的提示符,在超级用户权限下添加#号;在普通用户权限下添加$。为此可以获取当前Windows用户认证,判断用户是否属于管理员组。这里将判断过程封装为函数Is-Administrator,代码如下:

PS C:\> function Is-Administrator
{
$user = Get-User
$principal = New-Object `
Security.principal.windowsprincipal($user)
$principal.IsInRole("Administrators")
}
PS C:\> Is-Administrator
True

有了这个函数后即可书写前述提示符的格式:

PS C:\> function prompt
>> {
>>     $path = Get-Location
>>     $terminator = '$'
>>     if ((Is-Administrator))
{
$terminator = "#"
}
"$path $terminator "
}
C:\ #

要牢记一旦提示符函数抛出异常,PowerShell默认使用PS>提示符,并且不会提示任何形式的警告。要得到真实的错误信息,可以调用如下prompt函数:

PS C:\> function prompt
>> {
>>     something broken here
>> }
>>
PS>prompt
The term 'something' is not recognized as a cmdlet, 
function, operable program, or script file. Verify the term and try
 again.
At line:3 char:14
+     something <<<<  broken here
    + CategoryInfo          : ObjectNotFound: 
(something:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

5 总 结

本文介绍了Shell、宿主与宿主提供的脚本和cmdlet之间的通信机制、Shell环境,以及如何配置常见的Shell选项。配置Shell环境是使用PowerShell不可缺少的重要部分,必须要熟练掌握。

在本文展示了如何建立自己的PowerShell运行脚本的实验环境,签署脚本和签署其他类型的代码类似,由此可以学到对程序进行签名的基本方法。任何手段的安全都是相对的,没有绝对的安全,只有用得好才能够保证相对的安全。

 上一篇文章: 最新IT信息-微软Visual Studio 2010架构设计的功能应用
 下一篇文章: 最新IT信息-Windows PowerShell 2.0语言之扩展类型系统
发表评论】【告诉好友】【打印此文】【关闭窗口


技术文章  资源下载
经典素材  社区论坛
 中大型美容美发店老…[999]
 重庆多达学习俄语培…[2200]
 重庆恒祥广告有限公…[1931]
 重庆市南方阻燃电线…[2342]
 重庆舞美灯光音响有…[3085]
 重庆德鼎滤油机有限…[1868]
 重庆民生建材有限公…[2316]
 重庆集元科技有限公…[4097]
 重庆倍润商贸有限公…[1986]
 重庆腾达展览有限公…[3055]
 帝一网络创始人宣…--[3122]
 重庆vi设计在线祝…--[2712]
 重庆帝一网络书生…--[2829]
 馋嘴鸭的起伏和经…--[2968]
 机器感觉“卡”的…--[2895]
 ActionScript3打造…--[5652]
 在ASP文件中读取H…--[7210]
 vi设计经典案例--[63567]
 帅到掉渣-爆笑版勇…--[7022]
 一个女孩写的经典…--[6788]
没有相关文章
 (只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    没有任何评论
设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 重庆网站建设 | 
版权所有: vi设计在线  © 2005-2018 网站备案序号:渝ICP备06003824号
技术支持:帝一网络(重庆网站建设专家)