深刻理解powershell的管道工作原理

在类Unix操作系统(以及一些扩展,Windows)中,管道(英语:Pipeline)是原始的软件管道:即是一个由标准输入输出链接起来的进程集合,所以每一个进程的输出(stdout)被直接作为下一个进程的输入(stdin)。

通俗来说,管道将一个命令(也可以是程序,PowerShell中叫做command-lets)的输出导向另一个命令的输入,从而让两个(或多个命令)共同处理the same thing。在命令行中,我们用 “|” 表示管道。

为什么说是the same thing呢?

其实,Windows的CMD控制台、UNIX/LINUX 的 bash shell、powershell 都有管道的概念,只不过前两者输入输出的是文本流(text),而powershell输入输出的则是对象(object)。对象是一种特殊类型,它由属性、方法、属性别名等成员组成。

Powershell的管道是如何利用对象(object)进行工作的?接下来,我们需要解决两个部分:

1、TypeName(ByValue):对象的类型名

2、ByPropertyName(对象的属性名)

首先TypeName、ByPropertyName是什么样的角色呢?

TypeName 的例子:

一群鸡、鸭、鹅,按照家禽种类分别放入不同圈中饲养, 也就是按照TypeName,不同的对象类型进行划分。

ByPropertyName 的例子:

一群鸡、鸭、鹅,按照性别,把公的和母的分别放到两个圈中饲养。虽然它们是三类家禽,属于不同的对象,却有着相同的属性——性别,也就是ByPropertyName进行划分。

PowerShell的命令行工具command-lets如何通过类型名TypeName(ByValue)进行匹配:

get-service | stop-service

1、get-service运行后返回一些对象objects。

2、stop-service运行前等待接收这些对象objects,也就是get-service返回的objects。

通过运行命令:

get-service | get-member

输出:

TypeName

System.ServiceProcess.ServiceController

获取到了Get-Service返回的类型名TypeName:

System.ServiceProcess.ServiceController

返回对象的属性:

CanPauseAndContinue、DisplayName、CanPauseAndContinue、RequiredServices、Name等。

当我们把该对象通过管道 “|” 传递给 stop-service 时,stop-service要么匹配类型名TypeName,要么匹配属性名ByPropertyName。

那么 stop-service 接收对象的类型名如何获取呢?通过运行命令:

get-help stop-service -full

在输出的内容中找到 -InputObject 这一节:

-InputObject (ServiceController[])

Accept pipeline input? true (ByValue)

可以看到ServiceController[]与System.ServiceProcess.ServiceController是相同的,换句话说,它们通过TypeName( ByValue)能够进行匹配。

PowerShell的命令行工具command-lets如何通过属性名ByPropertyName进行匹配:

依然是上一个例子:

get-service | stop-service

我们已经知道,get-service和stop-service可以成功匹配TypeName,进行对象的传递和接收,那么它的执行结果是什么呢?

首先需要知道get-service返回的都是什么。在没有指定计算机名的情况下,默认是本地计算机即local,并通过检索本地计算机所有服务,默认返回每一个服务的状态、服务名和服务的显示名。

然后,stop-service会接收每一个服务对象,并将其停止。

这时,如果想要指定某一个特定服务,例如calc.exe,只想将它进行关闭,我们就需要通过属性名name来指定了。

例如:

get-service -name calc | stop-service

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容