Windows Powershell使用管道
管道并不是什么新事物,以前的cmd控制台也有重定向的命令,例如dir | more可以将结果分屏显示。
传统的cmd管道是基于文本的,但是powershell是基于对象。
ps> ls | sort-object -descending name | select-object name,length,lastwritetime | convertto-html | out-file ls.html ps> get-content .ls.html
name length lastwritetime test.vbs 170 2011/11/28 16:42:03 test.txt 242 2011/11/23 17:37:37 test.ps1 140 2011/12/2 18:47:35 psdrive.html 2556 2011/11/30 16:04:00 powershell_cmdlets.html 735892 2011/11/24 17:44:37 ping.bat 63 2011/11/28 15:30:04 name.html 7420 2011/11/24 17:37:28 myscript 2011/11/29 18:21:28 ls.html 434 2011/12/14 11:22:30 logotestconfig.xml 186 2011/11/28 11:12:08 function.ps1 21466 2011/11/29 19:23:58 employee.xml 556 2011/11/25 11:20:33 d.txt 0 2011/11/23 17:25:23 c.txt 0 2011/11/23 17:25:23 b.txt 0 2011/11/23 17:25:23 alias.ps1 12060 2011/11/24 20:27:24 alias 12060 2011/11/24 20:26:36 abc 2011/11/23 17:25:53 a.txt 26384 2011/11/24 20:04:31 a.html 67580 2011/11/24 18:30:13
首先列出当前目录下的目录和文件,然后根据文件名降序排列,再投影文件名,文件大小,文件的修改时间,转换成html格式,输出到当前目录的ls.html
面向对象的管道
上面的例子属于面向对象的管道,每个命令的末尾可以使用新的命令对上个命令的结果做进一步处理,除非管道是以输出命令结束的。就像sort-object一样,对文件的列表进行排序,需要告诉它排序的关键字,按照升序还是降序。ls的返回值为一个数组,数组中的每一个元素都是一个对象,对象的每一个属性都可以作为sort-object的排序关键字。但是排序时必须指定一个具体的关键字,因为powershell所传递的对象可能有很多属性。不像普通的文本,对象的信息都是结构化的,因此也使得powershell的管道变得更加强大和方便。
转换命令执行的结果为文本
在执行powershell命令时,解释器会默认在命令的结尾追加一个管道命令,out-default,这样可以将原来的对象结果以文本的形式显示在控制台上,但是并没有将结果进行转换,所以可以继续使用其它管道对对象的结果进行操作,但是一旦使用了诸如convertto-html这样的命令后,就会将结果转换成固定格式的纯文本。
常用的对管道结果进一步处理的命令有:
compare-object: 比较两组对象。
convertto-html: 将 microsoft .net framework 对象转换为可在 web 浏览器中显示的 html。
export-clixml: 创建对象的基于 xml 的表示形式并将其存储在文件中。
export-csv: 将 microsoft .net framework 对象转换为一系列以逗号分隔的、长度可变的 (csv) 字符串,并将这些字符串保存到
一个 csv 文件中。
foreach-object: 针对每一组输入对象执行操作。
format-list: 将输出的格式设置为属性列表,其中每个属性均各占一行显示。
format-table: 将输出的格式设置为表。
format-wide: 将对象的格式设置为只能显示每个对象的一个属性的宽表。
get-unique: 从排序列表返回唯一项目。
group-object: 指定的属性包含相同值的组对象。
import-clixml: 导入 clixml 文件,并在 windows powershell 中创建相应的对象。
measure-object: 计算对象的数字属性以及字符串对象(如文本文件)中的字符数、单词数和行数。
more: 对结果分屏显示。
out-file: 将输出发送到文件。
out-null: 删除输出,不将其发送到控制台。
out-printer: 将输出发送到打印机。
out-string: 将对象作为一列字符串发送到主机。
select-object: 选择一个对象或一组对象的指定属性。它还可以从对象的数组中选择唯一对象,也可以从对象数组的开头或末尾选
择指定个数的对象。
sort-object: 按属性值对象进行排序。
tee-object: 将命令输出保存在文件或变量中,并将其显示在控制台中。
where-object: 创建控制哪些对象沿着命令管道传递的筛选器。
管道的处理模式
当我们把许多命名组合成一个管道时,可能会感兴趣每一个命令的执行时是顺序执行还是同时执行?通过管道处理结果实际上是实时的。这就是为什么存在两个管道模式:
顺序模式(较慢):在顺序模式中管道中同一时间只执行一条命令,只有当前一条命令的所有执行完毕,才会把所有结果交付给下一条 命令。这种模式速度慢并且耗内存,因为必须需要很多次分配空间存储中间结果。
流模式(较快):流模式会立即执行所有命令,同一时间可能在执行多条命令。前一条命令可能会产生多个结果,但是一旦产生其中一个结果,就会立即交付给下一条命令处理。这样的流模式节省比较节省内存,可能管道的某个任务还在执行,但是已经有部分结果输出了。减少了中间结果的保存。
管道命令的阻塞
可以使用sort-object对管道的结果进行排序,但是有时候排序可能导致整个操作系统阻塞,因为排序命令的的执行属于顺序模式,必须得上一条命令的结果全部完成,才能排序。
因此在使用这类命令时,要注意操作对象的大小,和它们需要的内存。例如这条命令:
dir c: -recurse | sort-object
-recurse 选项是递归查询子目录,可想而知系统盘的文件和目录有多大。这条命令一旦运行起来,需要等很长很长的时间,甚至可能导致系统崩溃,得重启电脑。你可以在执行这条命令时,打开任务管理器查看powershell进程的内存占用在以每秒种几十兆的速率增加。
到底哪些命令可能系统阻塞,要视命令的实现方式以及处理的对象大小决定,例如sort-object导致阻塞的原因肯定是由于技术实现上采用的是内排序,没有使用外排序。但是象out-host -paging 这样的命令属于流出来模式,就一般不会导致系统阻塞。
上一篇: 大火收汁,可以多挺一会儿
推荐阅读
-
浅谈Windows平台上Docker安装与使用
-
Github for Windows图文使用教程
-
C#使用windows服务开启应用程序的方法
-
windows下安装使用LaTeX编辑器
-
干掉windows无脑设定:“始终使用选择的程序打开这种文件”、“使用Web服务查找正确的程序”
-
python使用wmi模块获取windows下的系统信息 监控系统
-
使用Python开发windows GUI程序入门实例
-
使用C#调试Windows服务模板项目
-
windows系统下jupyter notebook使用虚拟环境
-
在windows下使用淘宝的nginx插件 nginx_concat_module (附下载地址)