回归Dos操作的快感,进入PowerShell世界

概述

写下本篇文章源于参加Tech.Ed的一场关于Window PowerShell的课程。虽然之前也经常关注,但从没有亲自体验过。Windows PowerShell 是一种新的命令行外壳和脚本语言,用于进行系统管理和自动化任务,它建立在 .NET Framework 的基础上,可使 IT 专业人员和开发人员控制和自动完成Windows 和应用程序的管理。更为强大之处在于它可以调用.NET Framework中的类库,可以与COM、ADO、XML等交互。在本文中让我们一起来体会一下回归Doc操作的快感,进入强大无比的Windows PowerShell世界。

在Windows PowerShell中包括了:

1. 129 个命令行工具(称为“cmdlet”),用于执行常见系统管理任务,如管理服务、进程、事件日志、证书、注册表以及使用 Windows Management Instrumentation (WMI)。

2. 采用标准命名约定和通用参数的命令行工具,易于掌握和使用;以及用于对数据和对象进行排序、筛选以及格式设置的简便工具。

3. 对现有脚本语言、现有命令行工具以及多种 Windows 版本的支持,其中包括 Windows XP、Windows Server 2003、Windows Vista 以及 Windows Server 2008。

4. 方便的功能,使用户能够浏览数据存储(如注册表和证书存储),就像面对文件系统一样。

5. 用于管理位于不同存储中以及采用不同格式的 Windows 数据的标准实用程序,这些数据包括 Active Directory (ADSI)、Windows Management Instrumentation (WMI)、组件对象模型 (COM) 对象、ActiveX 数据对象 (ADO)、HTML 和 XML。

6. 在命令行进行的高级表达式分析和 .NET 对象处理,其中包括对对象进行流水线处理以帮助提高 IT 专业人员的工作效率。

7. 可扩展的接口,使独立软件供应商和企业开发人员能够构建自定义 cmdlet 以满足特有的应用程序和系统管理要求。

简单示例

在开始之前,先来看一个简单的示例,在.NET中获取当前系统所有进程的一段代码:

static void Main(string[] args)
{
    Process[] proceses = Process.GetProcesses();
    foreach (var item in proceses)
    {
        Console.WriteLine(item.ProcessName);
    }

    Console.ReadLine();
}

非常简单的一段代码,直接获取所有进程并显示出它们的名称,如下图所示:

TerryLee_0203

在安装完Windows PowerShell之后,可以看到它的界面与常用的命令行界面非常相似。现在再使用Windows PowerShell来获取一下当前系统所有的进程,只有一个命令就可以完成:

Get-Process

输出如下图所示:

TerryLee_0204 

PowerShell命令

在Windows PowerShell中,内置了129个命令供我们使用,这些命令称之为“Cmdlet”。除了很多在Dos中的命令继续可以使用之外,还有PowerShell内置的一些命令。每个命令由两部分组成,前半部分表示动作,后半部分表示动作的标的,如Get-Help、Get-Command、Write-Host等。在Windows PowerShell中输入命令时,不需要输入全部名称,可以只输入其中几个关键字,PowerShell会自动匹配,如只输入get-he,然后按下“Tab”键,屏幕上就可以出现完整的Get-Help命令。

Get-Help、Get-Command是PowerShell中非常重要的两个命令,可以获取帮助和获取所有的命令列表,如输入:

Get-Command

结果如下图所示,列出了所有的命令:

TerryLee_0209

与.NET Framework交互

Windows PowerShell更强大的地方在于它可以访问.NET Framework的类库,我们可以使用New-Object命令来创建一个.NET  Framework中的类实例,并保存在变量中,如下面的命令:

$d = New-Object -TypeName System.DateTime

这里使用New-Object来创建一个DateTime对象,使用-TypeName指定类型名称,创建的对象保存在$d变量中,输出结果如下图所示:

TerryLee_0205

除此之外,还可以使用-ArgumentList来指定参数,如下图所示:

TerryLee_0206 

与COM交互

使用Windows PowerShell还可以完全与COM交互,这使的Windows PowerShell的功能更加强大,有了上面前面提到的访问WMI、与.NET Framework交互,再加上与COM交互,可以说Windows PowerShell几乎无所不能。如下面看一个例子,使用PowerShell来访问IE,可以使用如下命令来创建一个IE的对象,并让它导航到博客园首页:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $true
$ie.Navigate("http://www.cnblogs.com")
$ie.Quit()

简单解释一下这段代码,首先创建一个IE的COM对象,并让它显示,然后导航到博客园首页,最后程序退出。如下图所示:

TerryLee_0207 

在这个过程中,大家会看到系统打开了一个IE窗口,并且导航到了博客园。

访问注册表

除此之外,Windows PowerShell还可以实现对注册表的完全控制,包括查询所有的Entry,或者修改、删除键值等,可以说是一切皆可控制,如使用下面的命令:

Get-ChildItem -Path hkcu:\

输出如下图所示,列出了HKEY_CURRENT_USER下面的信息:

TerryLee_0208

创建别名

在Windows PowerShell中,还允许为命令创建自己熟悉的别名,这样对于某些太长的命令名可以使用自己的缩写来表示,或者对于某些不太容易记忆的命令,使用自己喜欢的名字来表示。

Set-Alias gh Get-Help

这里设置gh为Get-Help命令的别名,这样在后面的操作中,当输入gh后,执行的命名就是Get-Help,如下图所示:

TerryLee_0210 

输出文件

在Windows PowerShell中,我们还可以把操作的结果输出到一个文件中,可以使用Out-File命令,另外可以使用-FilePath来指定输出的路径和文件名,如下命令所示:

Get-Process | Out-File -FilePath C:\temp.txt

现在打开C盘的temp.txt文件,可以看到输出的结果如下所示:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName 
-------  ------    -----      ----- -----   ------     -- ----------- 
    126       4    13272      10220    47            1204 audiodg
     73       4     2936       8080    61     1.05   3580 conime
    512       5     2188       4112    59     2.06    532 csrss
    511       7     5704      19744   182    93.44    588 csrss
   1249     109   127144     157128   561    44.67   6648 devenv 
    188       8    47088      73332   164 2,020.61   2508 dwm 
   2261      48    75040      72600   416   341.38   2548 explorer
      0       0        0         24     0               0 Idle  
    664      28    36696      49076   173    14.78   3384 iexplore
    969      35    74868      87576   328    43.92   7480 iexplore
    404      10     7280        640    96     6.23   2812 kavstart 
     65       3     1368       3360    46     0.09    316 kissvc
     80       5     6592       1012    62     1.28    496 kmailmon

以上所介绍只是Windows PowerShell强大功能的冰山之一角,除此之外,还可以与WMI交互,访问机器设备,对于输出结果格式化等等,这里不再介绍。

总结

本文中简单介绍了一下Windows PowerShell,相信通过这些介绍大家已经看到了Windows PowerShell的强大之处,而且在微软以后的产品中,都会支持使用PowerShell进行管理。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-11-09 01:23 TerryLee 阅读(15944) 评论(80) 编辑 收藏

我终于抢到沙发了!好激动,好激动呀!
 回复 引用 查看   
#2楼 2008-11-09 02:12 泊远      
TerryLee 大作,先睹为快!
 回复 引用 查看   
#3楼 2008-11-09 02:31 深蓝      
李老大的文章就是精彩
 回复 引用   
#4楼 2008-11-09 04:04 流仙[未注册用户]
有grep/sed/tail没有
 回复 引用 查看   
#5楼 2008-11-09 05:05 Evernory      
我晕,发帖都是半夜发的~
 回复 引用 查看   
#6楼 2008-11-09 07:04 Tony Qu      
Powershell确实很不错,和linux shell有的一拼!
 回复 引用 查看   
#7楼 2008-11-09 08:14 丁学      
@Tony Qu
linux shell应该是微软的努力目标,而且现在看来,PowerShell做得已经几乎足够好,PowerShell的一个优势是它只有一个,不像LinuxShell那样分了好几种,所以学习成本更低一些 当然,学习几种linux shell也不是什么难事

 回复 引用 查看   
#8楼 2008-11-09 08:33 李胜攀      
支持。
 回复 引用 查看   
#9楼 2008-11-09 10:03 Bob-wei      
LinuxShell十分优秀,如今的PowerShell也如此,微软总能给我们提供出有特色的工具,和TerryLee学习啦。
以前安装了PowerShell,但是没有怎么认真学习,看来要好好学习啦
 回复 引用   
#11楼 2008-11-09 10:24 小灰1[未注册用户]
不错
 回复 引用 查看   
#12楼 2008-11-09 10:36 李永京      
Cool
 回复 引用 查看   
#13楼 2008-11-09 10:39 zeus2      
说起来 powershell 跟linux shell 各有所长

我还是喜欢linux shell

 回复 引用 查看   
#14楼 2008-11-09 11:01 overred      
和linux 下的shell 差远了
他还是摆脱不了 .NET Framework
前几天make了一下vc下的boost 又体验了一把linux的shell的感觉,O(∩_∩)O哈哈~ ^+^

据说在Visual Studio 2010中可以直接编写PowerShell脚本,而且是支持智能感知与颜色识别的。
 回复 引用 查看   
#16楼[楼主] 2008-11-09 12:14 TerryLee      
@volnet(可以叫我大V)
欢迎常来抢沙发:)

 回复 引用 查看   
#17楼[楼主] 2008-11-09 12:15 TerryLee      
@泊远
呵呵,昨天刚参加完Tech.Ed,晚上回来就写下这篇文章:)

 回复 引用 查看   
#18楼[楼主] 2008-11-09 12:15 TerryLee      
@深蓝
过奖了,呵呵,谢谢支持:)

 回复 引用 查看   
#19楼[楼主] 2008-11-09 12:17 TerryLee      
@流仙
可以查一下文档,我没全部看,如果没有,我们也可以为Windows PowerShell自己扩展cmdlet。

 回复 引用 查看   
#20楼[楼主] 2008-11-09 12:17 TerryLee      
@Evernory
习惯了,呵呵,睡的比较晚:)

 回复 引用 查看   
#21楼[楼主] 2008-11-09 12:18 TerryLee      
@Tony Qu
嗯,PowerShell现在看来确实很强:)

 回复 引用 查看   
#22楼[楼主] 2008-11-09 12:18 TerryLee      
@丁学
赶快安装一下吧,呵呵,PowerShell太强大了,比我们在课程中听到的还要强大很多倍:)

 回复 引用 查看   
#23楼[楼主] 2008-11-09 12:19 TerryLee      
@李胜攀
谢谢支持:)

 回复 引用 查看   
#24楼[楼主] 2008-11-09 12:19 TerryLee      
@Bob-wei
嗯,现在的PowerShell确实很出色,呵呵,大家一起学习了:)

 回复 引用 查看   
#25楼[楼主] 2008-11-09 12:20 TerryLee      
@jannock
:)

 回复 引用 查看   
#26楼[楼主] 2008-11-09 12:20 TerryLee      
@上不了岸的鱼{ttzhang}
学习一下吧,呵呵,处理有些任务是非常方便的:)

 回复 引用 查看   
#27楼[楼主] 2008-11-09 12:20 TerryLee      
@小灰1
:)

 回复 引用 查看   
#28楼[楼主] 2008-11-09 12:21 TerryLee      
@李永京
:)

 回复 引用 查看   
#29楼[楼主] 2008-11-09 12:21 TerryLee      
@zeus2
对于Windows平台下的使用者来说,PowerShell是个非常强大的工具,呵呵:)

 回复 引用 查看   
#30楼[楼主] 2008-11-09 12:23 TerryLee      
@overred
摆脱不了.NET Framework,也不是什么坏事,加上它与.NET Framework交互的强大功能,使的Windows PowerShell更加如虎添翼,呵呵

 回复 引用 查看   
#31楼[楼主] 2008-11-09 12:23 TerryLee      
@Windie Chai(笑煞天)
好像是吧,呵呵,下一步准备研究一下自定义Windows PowerShell的cmdlet

 回复 引用 查看   
#32楼 2008-11-09 12:38 包建强      
这个Tool很不错, 研究DinnerNow必备
 回复 引用   
#33楼 2008-11-09 12:44 戏水2[未注册用户]
前些日子看了powershell一下子,感觉它得语法要比 linux下得shell语法复杂一些:) 还有结合了很多.net的东东 ,要记住可不是件容易的事情哦。
 回复 引用 查看   
#34楼 2008-11-09 13:00 王计平      
很dos也很Unix
 回复 引用 查看   
#35楼[楼主] 2008-11-09 14:02 TerryLee      
@包建强
呵呵,以后不管做IT Pro或者其他的,都应该必备:)

 回复 引用 查看   
#36楼[楼主] 2008-11-09 14:03 TerryLee      
@戏水2
不用全部记住,记住常用的就行,用到时可以通过Get-Help或Get-Command来查找:)

 回复 引用 查看   
#37楼[楼主] 2008-11-09 14:03 TerryLee      
@王计平
:)

 回复 引用   
#38楼 2008-11-09 14:08 不是吧[未注册用户]
难道 老大是正版的os?
 回复 引用 查看   
#39楼[楼主] 2008-11-09 14:14 TerryLee      
@不是吧
肯定是正版的了,呵呵,否则安装不了PowerShell:)

 回复 引用 查看   
#40楼 2008-11-09 14:24 overred      
@TerryLee
我只是感觉他老依靠framework,哈哈
为啥不直接调win32。。啥都能dump,而把诸如.net framework之类的东东都当作一个插件来处理呢?

一家之言哈,具体没实践。。。 PS:十一月的广西天气真是好。。。

 回复 引用   
#41楼 2008-11-09 18:29 lewis deng[未注册用户]
这个和linux比起来,简直就是一个字 菜
 回复 引用 查看   
#42楼 2008-11-09 18:37 airwolf2026      
http://space.cnblogs.com/forum/topic/6372/
老大,这是前几天发的.今天看你这个帖子.又特意用IE7开了下.发现还是有这个现象.莫非你的头像?俺确信俺的浏览器没有问题.系统没有中毒.

 回复 引用   
#43楼 2008-11-09 18:55 xiongli[未注册用户]
win2k8 R2里面的powershell console支持语法高亮,调试,脚本实时编辑等
 回复 引用 查看   
#44楼 2008-11-09 19:30 无恙      
没有觉得这个很实用啊,很酷倒是真的。


 回复 引用 查看   
#45楼 2008-11-09 19:51 G yc {Son of VB.NET}      
厉害啊~~

不知道,博主有没有 更 详细 文档~

另外, 问一下, 可以不可以做成批处理

之前,用了一次 Hyper-V Server
貌似, 那个配置工具,好像就是 PS写出来的~~

 回复 引用 查看   
#46楼[楼主] 2008-11-10 00:07 TerryLee      
@overred
你怎么跑广西去了?不是应该在北京吗?

 回复 引用 查看   
#47楼[楼主] 2008-11-10 00:07 TerryLee      
@lewis deng
菜在哪里呢?能不能说说看!

 回复 引用 查看   
#48楼[楼主] 2008-11-10 00:08 TerryLee      
@airwolf2026
这个是浏览器的问题,呵呵

 回复 引用 查看   
#49楼[楼主] 2008-11-10 00:08 TerryLee      
@xiongli
Windows Server 2008还没有试过呢:)

 回复 引用 查看   
#50楼[楼主] 2008-11-10 00:09 TerryLee      
@无恙
呵呵,还没有体会到它的强大,有了与.NET Framework、COM、WMI交互,它已经无敌了,无所不能。对于IT Pro的好处就不说了,单说开发来说,用它来做ASP.NET Web页面的UI测试都是可能的。

 回复 引用 查看   
#51楼[楼主] 2008-11-10 00:10 TerryLee      
@G yc {Son of VB.NET}
安装后会自带一些相应的文章,后续我也会再几篇,做批处理用Windows PowerShell来说是非常简单的:)

 回复 引用   
#52楼 2008-11-10 02:46 GanQuan[未注册用户]
没觉得dos有什么快感,净是痛苦的回忆。
 回复 引用 查看   
#53楼 2008-11-10 09:29 狼Robot      
留个名,以后用得上.
 回复 引用 查看   
#54楼 2008-11-10 09:45 amingo      
挖塞 nice
 回复 引用 查看   
#55楼 2008-11-10 10:21 overred      
@TerryLee 出差。。。呵呵
 回复 引用 查看   
#56楼 2008-11-11 19:48 包建强      
我看到几个MVP新翻译了一本PowerShell的书:
http://www.china-pub.com/42867

 回复 引用 查看   
#57楼 2008-11-11 22:17 lzlynn      
呵呵 这东西~无语
 回复 引用 查看   
#58楼[楼主] 2008-11-12 11:10 TerryLee      
@GanQuan
那你就得认可键盘比鼠标快,才会有这样的快感,呵呵,否则还是用鼠标比较好:)

 回复 引用 查看   
#59楼[楼主] 2008-11-12 11:10 TerryLee      
@狼Robot
非常强大的东东,肯定能用上:)

 回复 引用 查看   
#60楼[楼主] 2008-11-12 11:11 TerryLee      
@amingo
:)

 回复 引用 查看   
#61楼[楼主] 2008-11-12 11:11 TerryLee      
@overred
哦,原来如此:)

 回复 引用 查看   
#62楼[楼主] 2008-11-12 11:11 TerryLee      
@包建强
嗯,不过我建议买本原版的英文书来看比较好:)

 回复 引用 查看   
#63楼[楼主] 2008-11-12 11:12 TerryLee      
@lzlynn
这东西很强大啊

 回复 引用   
#64楼 2008-11-16 02:19 飞林沙
Windows上终于也有Shell了 学习......
 回复 引用 查看   
#65楼 2008-11-16 02:29 飞林沙      
Windows上终于也有Shell了 学习......
 回复 引用 查看   
#66楼[楼主] 2008-11-17 23:19 TerryLee      
@飞林沙
功能非常强大,值得学习:)

 回复 引用 查看   
#67楼 2008-11-20 16:44 xjb      
很强大,学习一下
 回复 引用 查看   
#68楼[楼主] 2008-11-20 23:50 TerryLee      
@xjb
的确很强大:)

 回复 引用 查看   
#69楼 2008-11-28 00:13 ξ箫音ξ      
小李的真能尝鲜!我正在编写《Windows Powershell应用编程最佳实践》的书;到时候我们可以交流;估计明年6月前出版。
 回复 引用 查看   
#70楼[楼主] 2008-11-30 23:58 TerryLee      
@ξ箫音ξ
很强悍,呵呵,现在微软所有的东西都好像提供了基于PowerShell的管理。。

 回复 引用   
#71楼 2009-03-18 17:14 yxx9527
"在本文中让我们一起来体会一下回归Doc操作的快感,进入强大无比的Windows PowerShell世界。"--------是dos吧,文章写得很棒。
 回复 引用 查看   
#72楼 2009-04-17 19:07 小隐任行      
PowerShell 如果是基于.net 的发展起来,跟一门新的语言或脚本并无差异,何来回归Dos的快感?
windows比起linux造成系统的不稳定因素中,界面是硬伤,我想PowerShell会是以抛弃界面为基础发展方向的。

 回复 引用 查看   
#73楼 2009-05-13 15:01 MadGoat      
提个笔误
在本文中让我们一起来体会一下回归Doc操作的快感。
应该是dos嘛

 回复 引用 查看   
#74楼[楼主] 2009-05-15 09:35 TerryLee      
@MadGoat
谢谢,笔误 :)

 回复 引用 查看   
#75楼 2009-08-05 18:12 Fired Fish      
我比较喜欢用命令行 这样比鼠标快不少
但是我更加喜欢linux下面的shell
直接终端运行

 回复 引用 查看   
#76楼 2009-08-21 21:21 lyra      
PowerShell 的输出是对象而不是文本而且调用.Net类库非常简单

Here are some samples:

# Read file to a string
$s = [System.IO.File]::ReadAllText("c:\a.txt");

# INCREASE PS WINDOW WIDTH
$current=$host.ui.rawui.BufferSize
if ($current.width -lt 120)
{
$current.width=120
$host.ui.rawui.BufferSize=$current
}
$current=$host.ui.rawui.WindowSize
if ($current.width -lt 120)
{
$current.width=120
$host.ui.rawui.WindowSize=$current
}


 回复 引用 查看   
#77楼 2009-09-02 19:18 邀月      
楼主辛苦了! 这个很不错! 最喜欢的就是鼠标右键功能!从此不用cmd
 回复 引用 查看   
#78楼 2010-11-09 01:31 天上有云      

楼主辛苦了。谢谢分享哈。
columbia sportswear outlet | the north face outlet

 回复 引用 查看   
#79楼 2010-12-24 15:27 四海清一      
一群马屁精!!!!
 回复 引用 查看   
#80楼 2011-05-22 21:13 寂寞暴走      
想写点ps实用的东东!到时候分享!
 回复 引用 查看   
#81楼 2011-12-29 14:41 wenwei      
@四海清一
haha