Powershell 学习:ByValue 管道传输

当两条命令串联在一起时,Powershell 必须搞清楚怎样将第一条命令的输出作为第二条命令的输入。

如下图所示,在该文本中,每行均代表一个计算机的名称:

你可能希望将这部分计算机名称作为某些命令的输入,以便该命令会在文本中的计算机上被运行,比如:

Get-Content .\computer.txt | Get-Service

当运行Get-Content 命令时,它会将文本中的计算机名放入管道,之后Powershell再决定如何将该数据传递给 Get-Service命令。

然而Powershell 一次只能使用一个参数来接收传入数据。 所以它必须决定由Get-Service 的哪个参数来接受 ge-content 的输出结果,这个决定的过程就被称为: 管道参数绑定 (pipeline parameter binding)。 Powershell 会使用两种方法将get-content 的输出结果传入给 get-service的某个参数,分别为: ByValue 以及 ByPropertyName

  • 方案A: ByValue

使用该方案时,Powershell 会确认第一个命令产生的数据类型, 然后查看第二个命令中哪个参数可以接收由管道传来的对象的类型。

可以使用如下方式进行验证, 通过管道将get-content 的输出结果发送给Get-Member, 然后就可以查到该命令产生的结果的对象类型。

之后查看命令: get-service 的详细帮助信息,确定get-service命令的哪些参数可以接收ByValue管道传输过来的数据类型。

我们可以看到,get-content 产生的数据类型是:TypeName: System.String

在get-service 的帮助文档中,存在两个个可以接收 ByValue 管道传输过来数据的参数, 分别为: -InputObject 和 -Name

然而第一个参数: -InputObject 接收的数据类型是:ServiceController[] , 只有-Name 可以接收ByValue 管道传输的数据,而且数据类型是 String 类型的。 但是,通过该参数的说明我们会发现,这个参数需要的是一个服务的名称,并不是我们传递过来的计算机的名称。 如果我们继续 执行该命令,那么得到的结果肯定不是我们想要的。

Powershell 只允许使用一个参数去接收ByValue 管道传递过来的对象类型,也就意味着由于-Name 参数接收了来自ByValue 管道返回的String 类型,那么其他参数就无法再接收该数据了。因此我们希望通过这种方式将计算机名传递给 get-service 命令是行不通的。

我们再看另外一个例子:  Get-Process -Name note* | Stop-Process

我们将Get-Process -Name note* 的输出结果通过管道传递给 get-member, 之后再查看 stop-process 的详细帮助。

我们可以看到Get-Process -Name note* 命令返回的对象的类型为:  TypeName: System.Diagnostics.Process

stop-process 命令会通过 -InputObject 参数来接收这些来自ByValue 管道的进程对象。通过帮助信息可以知道,该参数会停止由指定的进程对象表 表示的进程。也就是说第一个命令返回一些进程对象,第二个命令会停止这些进程。

在下一篇文章中将会对ByPropertyName管道传输进行分析。

猜你喜欢

转载自blog.csdn.net/weixin_42545594/article/details/81564190