不一样的命令行 – Windows PowerShell简介 (转载)

转载自http://www.cnblogs.com/grapeot/archive/2010/02/22/1670822.html,谢谢博主。

引子

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

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

(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-10-07 05:46:24

不一样的命令行 – Windows PowerShell简介 (转载)的相关文章

不一样的命令行 – Windows PowerShell简介 之 “蛋疼的伪装–Profile”详细实现

(本文的修改方法参照http://www.cnblogs.com/grapeot/archive/2010/02/22/1670822.html,只是详细列出修改的步骤之一.) 通过修改profile来实现,profile的介绍见http://technet.microsoft.com/en-us/library/bb613488(v=vs.85).aspx 1.更改其窗口背景和图标,效果如下: 2.生成profile 先产看是否已经存在profile, >test-path $profile

用命令行设置powershell 屏幕缓冲区大小

背景:用命令行设置powershell缓冲区大下 如果屏幕缓冲区过小(高度和宽度),则在执行命令后,信息显示不完全,即使输出到文本也会有部分信息以 ... 代替,这是很不方便的,因此需要修改屏幕缓冲区的大小.以下是以命令方式修改powershell 屏幕缓冲区的大小. 方法: #设置powershell 控制台屏幕缓冲区 $host.UI.RawUI.BufferSize = new-object System.Management.Automation.Host.Size(175,20000)

第4章4节《MonkeyRunner源码剖析》ADB协议及服务: ADB命令行客户端使用简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 从前面几个小节我们知道ADB命令行客户端是存在与主机端的一个命令,用户可以使用该命令来发送服务请求到ADB服务器,ADB服务器再判断该服务请求是主机服务请求还是本地服务请求来决定是否应该将请求传送给远程adbd守护进程

Linux中的一个命令行计算器bc简介

假如你在一个图形桌面环境中需要一个计算器时,你可能只需要一路进行点击便可以找到一个计算器.例如,Fedora 工作站中就已经包含了一个名为 Calculator 的工具.它有着几种不同的操作模式,例如,你可以进行复杂的数学运算或者金融运算.但是,你知道吗,命令行也提供了一个与之相似的名为 bc 的工具? bc 工具可以为你提供的功能可以满足你对科学计算器.金融计算器或者是简单计算器的期望.另外,假如需要的话,它还可以从命令行中被脚本化.这使得当你需要做复杂的数学运算时,你可以在 shell 脚本

【linux使用】bash shell命令行常用快捷键 (转载)

移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 <-:按字符左移(往命令行尾部方向,后移) Alt + F: 按单词右移 (往命令行尾部方向,前移) Alt + B: 按单词左移(往命令行首部方向,后移) 编辑: Ctrl + C: 删除整行 Ctrl + L: 清屏,相当于clear Ctrl + U: 简介光标位置到行首的内容(包括自身),以后可用

ubuntu 下命令行格式化 U盘 (转载)

ubuntu 下命令行格式化 U盘 命令行:原则是先卸载,后格式化. 假如u盘挂载在/media/disk上 卸载: sudo umount /media/disk 格式化: sudo mkfs.vfat /dev/sdb 可以用 sudo fdisk -l查看u盘是不是/dev/sdb. 不同的格式对应不同的格式化命令: mkfs mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.msdos mkfs.vfat mkfs.bfs mkfs.ext2 mkfs.ex

在命令行快速切换目录(转载)

今天在微博上看到一个用命令行快速切换目录的文章,比之前自己的解决方案好了非常多,必须记录下来分享下. 每天在命令行下,一大部分的工作都是一遍又一遍的输入 cd ~/some/very/deep/often-used/directory这样来切换目录,现在利用一个简单的配置可以实现如下效果: 首先进入我的日常工作目录,标记一个书签mark sanguo cd /Users/kimi/work/123guo/sanguo mark sanguo 以后我再进入这个目录只需要g sanguo即可 g s

Windows PowerShell 学习---第一章 PowerShell介绍

第1章 PowerShell介绍 1.1.什么是PowerShell 2006年,微软发布一款叫做Windows PowerShell的全新脚本语言. PowerShell与命令提示符shell一样,PowerShell可以进行交互性地输入命令.也可以很容易的使用管道和重定向将文件和程序串联起来. 不过,PowerShell确是一个强大的面向对象的语言,可以用于复杂的脚本编程. 1.2.面向对象的命令shell 关于cmd 如果在命令提示符下输入dir,dir命令将会在屏幕打印出目录中的文件名.

pscalc命令行计算工具【下载】

研发背景 经常用批处理的人都知道,cmd命令只支持整数的运算,无法对带小数点的数值进行计算,因此可见cmd的脚本功能是非常有限的,还好微软意识到了这一点,在Win7版本以上的系统中均集成了最新的命令行工具PowerShell,它功能强大,是在 .NET Framework 公共语言运行时 (CLR) 和 .NET Framework 的基础上构建的,并接受和返回 .NET Framework 对象,是专为系统管理员设计的新 Windows 命令行 shell.PowerShell功能这么强大,浮