有连续好几天没更新了,你们一定没想到,周日我还在写文章。实在没办法,工作日太忙,工作之余还有其它事要去处理。而写一篇原创技术内容其实要消耗数小时,只能很抱歉的拖到周末了。
相信大部分人多少见过管道(符) “|” ,无论在什么系统里,都会看到过一些命令以“* | *” 形式组合出现,这就是管道最常见的使用方式了。什么是管道呢,从字面上就可以理解所谓管道自然就是像管道一样作为传输用的。而PowerShell里的管道十分有用和常用,但是我发现日常工作中有不少人在用PowerShell管道传递对象的时候会去碰运气来乱传对象,因为他们并不十分明白管道的工作机制,今天我就要说说PowerShell管道,它是做什么的和怎么工作的。
先来看一条使用了管道操作的PowerShell命令,我想用这条命令关闭我指定的进程对象。
可以看到,命令成功运行完成,PowerShell非常顺利的关闭了我指定的进程对象。这是怎么做到的呢,其实很简单,Get-Process获取进程名为notepad的进程信息,并通过管道传递给后面的命令Stop-Process并把它关闭。
虽然运行操作起来很简单,但是管道是如何知道和工作的呢。这里就不得不提到ByValue了,因为在PowerShell中如果想让某个命令的参数能够接收从管道传来的对象,那么这个命令必须有一个支持ByValue的参数,你可能有点困惑对于ByValue的概念,没关系,我先运行Get-Help Stop-Process -Full命令让你看下Stop-Process命令的帮助信息。
你应该发现了-InputObject参数显示他支持管道输入也就是我们说的他是一个支持ByValue功能参数。这里必须要记住,每个PowerShell命令只含有一个ByValue,为什么呢,因为如果多个参数都支持ByValue的话,那这个命令的参数如何知道管道传过来的对象应该给哪个参数用呢?这样说你是否清楚了些ByValue的作用。仔细看你会发现-InputObject参数它接受的是一个Process类型的对象,这就说明传过来的对象必须是Process类型,否则它可不认啊。
真是这样吗,那就验证看看吧。
我定义了一个notepad字符串,然后用管道传给Stop-Process想关闭notepad进程,结果报错了。错误提示明确告诉我们输入的对象无法用于任何参数上啊,因为类型不同嘛。
回忆下刚开始我们一开始用的命令Get-Process -Name notepad | Stop-Process -PassThru能顺利完成,那肯定是第一个命令Get-Process输出的是Process对象,否则第二个命令Stop-Process可是不认的呢。
我用Get-Process | Get-Member输出看看Get-Process的类型再次确认了Get-Process肯定是Process对象。
不过,让我们想象一个真实存在的场景:首先你应该清楚了管道是如何工作的,管道会把前一个命令的对象传递给第二个命令所对应支持ByValue的参数,然后去执行。但是如果那个支持ByValue的参数,它的对象类型恰好与传递过来的对像类型不匹配,那怎么办呢?毕竟,连对象类型都根本不一致,两个命令怎么通过管道互动?
接下来我要说的ByPropertyName就是负责解决这个问题的,如果命令中支持ByValue的参数但它的对象类型与传递过来的对象不一致,那么就会去寻找是否有支持ByPropertyName的参数。ByPropertyName理解起来非常简单,管道前的命令所传递的参数属性名与管道后面的命令中的参数名有相同参数名字就可以了。是不是又有点困惑了?没关系,我继续拿一个示例给你展示明白。
比如Get-Service -Name notepad | Stop-Process这条命令,语法理论上是正确的,因为Get-Service里包含一个Name属性参数,Stop-Process里也包含一个Name属性参数,那么这就满足我们之前说的2个命令传递的参数名必须是相同的参数名。
用Get-Help方法分别对Get-Server和Stop-Process查看下帮助信息,发现都包含Name参数,并且都满足是一个ByPropertyName。
但是现实情况是你如果运行Get-Service -Name notepad | Stop-Process这条命令肯定是会得到一个错误,因为正常来说在系统后台你不会有一个运行名为notepad的服务。
为了说明这个操作过程,我写了一个例子,如下我有一个csv文件,文件里面包含了notepad进程的信息,而且他包含有Name属性。
按照之前说的,前后两个命令如果都含有相同参数名,它们通过管道就可以互相传输了,在这里,它们都含有Name属性参数。
那么命令顺利运行了。
本文介绍了PowerShell中的管道符"|",阐述了其作为对象传输的工作原理。通过实例展示了如何利用ByValue和ByPropertyName参数进行命令间的数据传递,解释了当对象类型不匹配时,ByPropertyName如何解决这个问题。"
111424948,10296080,Python使用pandas筛选指定列值,"['pandas', '数据处理', 'Python编程', '数据分析', 'SQL操作']
1733

被折叠的 条评论
为什么被折叠?



