Windows PowerShell是啥?看完本文你就懂它了_PowerShell

引子

一直很羡慕Linux的命令提示符(当然他们叫Shell)。正则表达式,管道,各种神奇的命令,组合起来就能高效完成很多复杂的任务。效率实在是高。流了n年的哈喇子以后,终于有幸用上了Win7,邂逅了cmd的升级版:Windows PowerShell。从此暗爽无比,原来Windows下也有这样的利器呀~
看看下面的Windows脚本,不到15行有效代码。在Win7下只要右击脚本文件,选择Run with PowerShell,就会自动找到最占内存的10个进程,然后将它们占用的内存画成一个三维饼图,如下图所示。

复制代码 代码如下:

# create new excel instance
 $objExcel = New-Object -comobject Excel.Application
 $objExcel.Visible = $True
 $objWorkbook = $objExcel.Workbooks.Add()
 $objWorksheet = $objWorkbook.Worksheets.Item(1)

 # write information to the excel file
$i = 0
$first10 = (ps | sort ws -Descending | select -first 10)
$first10 | foreach -Process {$i++; $objWorksheet.Cells.Item($i,1) = $_.name; $objWorksheet.Cells.Item($i,2) = $_.ws}
$otherMem = (ps | measure ws -s).Sum - ($first10 | measure ws -s).Sum
$objWorksheet.Cells.Item(11,1) = "Others"; $objWorksheet.Cells.Item(11,2) = $otherMem

# draw the pie chart
$objCharts = $objWorksheet.ChartObjects()
$objChart = $objCharts.Add(0, 0, 500, 300)
$objChart.Chart.SetSourceData($objWorksheet.range("A1:B11"), 2)
$objChart.Chart.ChartType = 70
$objChart.Chart.ApplyDataLabels(5)

(1. 这个脚本调用了Excel的COM库。 2. 当然从命令耦合的角度来看,输出成文本格式更有利,但这个例子主要想说明PowerShell的强大以及微软产品优异的复用性。 3. 要手动启动PowerShell,可以在开始菜单的搜索框中直接键入PowerShell回车即可)
简单领略PowerShell的强大之后,下文就从几个方面介绍一下PowerShell相对于以往版本的命令提示符甚至Linux Shell的优势。

Cmdlet + Regex + Pipeline + ...

以往cmd相对于Shell有很多不足,比如命令偏少,部分命令功能偏弱,对正则表达式不支持等等。但现在PowerShell一下赶上来不少。2.0 RTM版内建支持414个命令(术语称为cmdlet),支持正则表达式,强大的管道应用(其实管道本身的功能和以前差不多,关键是冒出来一堆能用管道的命令,比如more, sort, foreach等等),和系统的联系也比以前紧密了很多。

举几个例子来说明:

dir registry::HKEY_CURRENT_USER可以直接显示注册表相应位置的内容,可以看到dir的功能改进了不少。

ps | sort ws -Descending | select -first 10可以显示占用内存最大的10个进程,可以看到管道的灵活应用。

dir -Name | ? {$_ -match "(?<num>.).*(\k<num>)"}可以显示出当前目录下文件名有重复字符的文件。比如abcda.efg,而abcd.efg则不会显示出来。可以看到PowerShell对正则表达式的支持相当强大。(确切的说严格的正则表达式 已经无法实现这样的效果,需要上下文无关文法 才能够支持。)
以前为了演示Linux Shell的强大,Stephenjy发了一个自己的截图,在遇见PowerShell前觉得好神奇,所幸现在也可以实现了。:-)

(为了节约显示空间,PowerShell的部分显示结果被删除,但这个Prompt效果可以用以下脚本验证: function prompt {"($env:username)-($env:computername)-(`$?: $?)-(jobs: $((get-job | measure).Count))-($(get-location))`n(! $(((history)[-1]).ID + 1))->"})

大杀器 - 面向对象

Linux的设计思想决定所有的输入和输出都尽可能是文本格式,这样可以方便各进程间的合作。同样这也要求各个程序提供一定强度的文本解析能力。但Windows的思想与此不同,PowerShell中很多输入输出都不是普通的文本(plain text),而是一个个对象(objects)。因此与其说PowerShell是一种交互环境,不如说它是一种强大语言的Runtime,而这种语言甚至是面向对象的。

比如当键入get-process查看当前进程列表时,系统返回的是这样的列表:

复制代码 代码如下:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    318       8    12948       3872    84            1728 AppleMobileD
    115       5    13816      13328    38            6920 audiodg
   1315      21    11732      10988   108            2544 CcmExec
... ...

虽然看似一般的格式化文本,但其实这是一个数组,而每个数组元素又是Process类型的对象。同.NET一脉相承,PowerShell中的所有的类都继承自Object,且支持GetType()函数。因此我们可以执行(get-process).GetType()来看看它的类型:

复制代码 代码如下:

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

而数组中每个元素的类型可以用(get-process)[0].GetType()查看:

复制代码 代码如下:

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Process                                  System.ComponentM...

其中面向思想的思想非常明显,类成员,方法,继承都出现了。个人感觉这样的好处并不是指望能用PowerShell写什么大型软件,而是体现在另外两个方面:首先,这样让内置的cmdlet及其数据结构组织清晰,符合直觉,写代码时速度快不容易出错。第二,对面向对象的内建支持也为后面无缝接合.NET和COM接口提供了基础。

站在巨人的肩膀上 - 无缝调用.NET/COM

.NET Framework中包含了一个异常强大的库,而微软为了保证二进制层面上跨语言的兼容性,很多库都是用COM封装的。PowerShell的一大特色就是可以直接调用这些库。比如前面的示例用$objExcel = New-Object -comobject Excel.Application创建了一个Excel对象。而wikipedia上的一个脚本更示范了这种无缝调用的强大。下面这个3句话的脚本的作用是显示一个RSS源最近的8篇文章的标题。注意其中网络连接,内容下载,XML解析等工作全部由.NET库完成,正因为站在巨人的肩膀上,PowerShell在实际使用中往往左右逢源,简洁高效。

复制代码 代码如下:

$rssUrl = "http://blogs.msdn.com/powershell/rss.aspx"
$blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
$blog.rss.channel.item | select title -first 8

编辑,运行,调试 - IDE

Windows程序开发,尤其是基于微软技术的开发很爽的一点就是有强大的IDE和专业的文档作支持。不论是Windows下的Visual Studio还是Linux下的Mono Develop,甚至连PowerShell这样的语言都有集编辑与调试为一体的IDE:Windows PowerShell ISE。有了自动完成,即时脚本交互,调试甚至远程调试,PowerShell脚本写起来“甚爽甚强巨”。当然文档也是一般的强大,MSDN中关于PowerShell的部分依旧专业浩瀚。

蛋疼的伪装 - Profile

有了PowerShell以后,很少就去cmd了。不过作为一个蛋疼的装B男,把PowerShell伪装成cmd也是挺有乐趣的一件事。不难发现PowerShell和cmd仅仅在图标,标题,背景色,提示符,以及刚启动时的显示文字五个方面不同。图标和背景色在快捷方式属性中可以很方便的修改。而标题和提示符的修改就要用到Profile了。所谓Profile就是在每次启动PowerShell时都首先自动运行的一段脚本。这个脚本的路径在$profile变量中有设定。只要设定$host.UI.RawUI.WindowTitle为C:\windows\system32\cmd.exe就能将标题伪装为cmd。而自定义提示符为当前路径在PowerShell中自然万分简单。至于启动时的显示文字,只要通过/nologo参数隐藏原有的版本信息,再打印一行cmd中的文字就好了。最终效果如图:(关于Profile,可以参见这个链接)

另:进程级工作调度 – 并行支持?

==========================================================
随着多核处理器的迅速发展,从.NET Framework 4.0开始,并行计算被一再强调。从System.Threading中新增加的并行工具类到F#这种非常适合并行化的函数式语言,微软适时对线程级并行提供了强大的支持。但是对于进程级的工作调度,Windows似乎还相当原始。举个最简单的例子来说,如果我们同时向一个移动硬盘启动5个拷贝会话的话,Windows会同时开始所有的拷贝操作。这样磁头会在不同的目标位置间反复进行无意义的移动(寻道),于是在硬盘灯的狂闪中,大量时间就被浪费了。同样当我们同时启动数个计算量大的进程时,Windows也会试图让这些进程“齐头并进”。然而为了避免某个进程被饿死,系统又不得不频繁切换进程,于是大量的时间又被浪费在了保存现场,进程切换,恢复现场上。这样来看,进程级的并行做的反而不够好。

所幸PowerShell中加入了任务调度管理功能。通过简单的实验,我们可以发现PowerShell对jobs的调度和Windows默认的大不相同,它一般维持和CPU核心数相同的进程高速运转,而其它进程仅仅占用小部分CPU时间。直到前面的进程结束工作后,后面才有新的进程递补进入高速运转的状态。==========================================================
后来更仔细地做了实验以后发现,原来Windows内置的进程调度方案就是小部分高速运转(在我的双核处理器上是两个进程占用50%CPU),大部分低速跟进(其他所有进程分享剩下的50%CPU)。这样PowerShell的工作调度并没有改善系统原有的现状。同时由于PowerShell的调度系统需要占用不小的内存,初始化也需要时间。在实测中甚至比默认调度慢了50%。这个实验结果比较囧。不晓得为什么PowerShell中为什么要加入Job这个东西,难道仅仅为了异步调用吗?

时间: 2024-08-03 07:26:43

Windows PowerShell是啥?看完本文你就懂它了_PowerShell的相关文章

看完小白也能懂什么是公有云、私有云、混合云

近几年随着云计算技术的逐渐普及,越来越多的企业开始选择了部署云计算方案,但是公有云.私有云.混合云到底怎么选,或者说它们各自具体有什么区别,很多人是不了解的,针对不同需求的企业拥有不同部署方案,如果不了解的话,选型也会为难.今天我们深入浅出举一个例子,让你通俗的明白什么是公有云.私有云.混合云和社区云. 张三.李四.王五住一栋楼,楼下一个大规模的饭店.张三一直在家做饭,这是私有云,厨房是自建机房.李四一直在饭店吃,这是公有云,饭店是云数据中心.王五牛叉,在饭店有个固定包间,包间不对外人开放,这是

云服务器ECS是什么鬼?看完这篇就懂了

近十年来,云计算概念大肆崛起,而作为一个新兴概念很多专业概念还不为人熟知,比如云服务器ecs就是其中一个.云服务器ecs作为一个专有名词频繁出现在搜索榜单中.那么今天笔者就与大家聊一聊这看似高深莫测的云服务器ecs究竟是什么鬼? 为了更好地了解云服务器ecs,我们可以想一下平时这个专业名词的应用场景.仔细回想,你会发现,似乎和云服务器没什么太大的差别.的确如此. 云服务器ecs的概念与作用 云服务器(Elastic Compute Service,简称 ECS)是一种简单高效.处理能力可弹性伸缩

测试运行: 使用Windows PowerShell进行小型测试

您可以将 Windows PowerShell 看成是对旧的 cmd.exe 命令外壳程序以及相关 .bat 文件的一个重大升级.虽然 Windows PowerShell 是为系统管理任务设计的,但它的某些功能也使之完全适用于轻量级测试任务.本月,我将以 Windows PowerShell 命令行和轻量级 Windows PowerShell 脚本两种方式对基于 Microsoft .NET Framework 的代码模块进行测试. 请看图 1 和图 2 中所示的屏幕截图.图 1 显示了对名

Windows PowerShell漫谈-win7下没有超级终端

Windows PowerShell是我在研究win7新特性的时候发现的新工具,起初没有对它产生太大的兴趣,只是简单看看了有关它的介绍.简单使用了一下,感觉上它和cmd.exe没有本质区别.对它产生兴趣是一个纯粹的偶然, 有一次一个硬件工程师同事让我帮忙联调串口,我才发现win7下没有超级终端,结果那个同事给了我一个串口助手. 本着对问题刨根问底的精神我上网搜了一下有关win7和超级终端的问题,才发现win7下真的没有超级终端,有些网友推荐说PowerShell具备超级终端的功能,可以调试串口,

揭秘地球在宇宙中的地位!看完我整个人都惊呆了!

今天我们来看看地球在宇宙中的地位!这是我们的地球.我们地球的体积是10832.073亿立方公里.假如你是世界首富,有用不完的钱,天天玩,甚至你可以活到200岁,你能把地球走完吗?不能!这样想想地球还是很大的嘛! 这是我们地球和月球的对比.一个地球有49个月球那么大.月球是小弟. 五兄弟,地球还是是大哥,不错. 大家伙来了.海王星有58个地球大,天王星有65个地球大. 更大的家伙.土星相当于830个地球,木星有1300个地球那么大! 我的地盘.我作主!太阳系老大出面,有130万个地球那么大! 老大

Facebook电商新尝试:看完广告想买马上就可以买

  在过去多年的试验中,所谓的"社交电商"未成气候,不过社交网络巨头Facebook仍在不停尝试,日前其推出一种新广告,鼓励用户在看完广告之后立刻购买商品. 媒体指出,Facebook依然希望把信息流界面,扩展成为一个购物场所. Facebook推出了一种全新的广告产品,首先企业可以利用视频广告推广产品,而在视频广告下侧,他们可以显示更多的商品图片.产品型号列表,让用户直接购买. 点击之后,用户将能够看到更多的商品信息,这些内容存放在Facebook平台上,能够快速载入,如果用户点击购

看完30篇网站推广的文章之后的总结

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站的优化服务于网站的推广,网站的推广服务于网络营销,所以我一直认为网站的推广在电子商务中起到一个承上启下的作用,用时它也是电子商务的核心. 俺的网站是 萝卜小说网,一下是俺给你们"偷"来的!呵呵 1. 网站推广 1.)线上推广 注册网络文件夹(qq,114la,百度收藏夹等),去权重比较高的商铺发帖,比如淘宝网.有啊等,

看完这篇文章后,别再说自己不懂用户画像了

用户画像是一个挺新颖的词,最初它是大数据行业言必及之的时髦概念.现在我们运营谈及用户画像,它也是和精准营销.精细化运营直接钩挂的.这篇文章主要讲产品和运营角度的用户画像. 希望看完后,解决你一切关于用户画像的疑问. 什么是用户画像 用户画像一点也不神秘,它是根据用户在互联网留下的种种数据,主动或被动地收集,最后加工成一系列的标签.比如猜用户是男是女,哪里人,工资多少,有没有谈恋爱,喜欢什么,准备剁手购物吗? 我们常把用户标签和用户画像对等.但凡用户画像的文章,类似上文图片都会出现,有用烂的趋势.

竞争对手网站分析全攻略新手看完告别菜鸟时代

如果你想告别外链专员,只负责论坛回帖推广或者只负责QQ推广等等专员时代的话,那么你应该学会分析竞争对手的网站的优化情况,当你某一天产生了全方位分 析竞争对手的seo状况这个念头时,事实上你的意识已经开始复苏,你痛恨只发外链的现状,你打广告做得麻木,你在论坛发帖发得想吐,QQ加来加去加得 手软,你感受不到关键词排名变化到底和自己有几毛钱的关系,如果你是一名seo人员,那么现在就应该开始学着分析竞争对手网站优化的情况,告别菜鸟seo 时代,从分析竞争对手做起.开篇前戏太多,下面直接进入主题. 分析竞