管道传输

适用于: Exchange Server 2010 SP2

上一次修改主题: 2009-02-23

在 Exchange 命令行管理程序中,管道传输是指一个 cmdlet 在执行操作时使用另一个 cmdlet 的输出的行为。管道传输使用管道符号“|”来完成。同一名词 cmdlet 集中的所有动词都可以使用其他命令通过管道传输而来的信息。一些名词 cmdlet 集还允许通过管道向另一个名词 cmdlet 集传递数据。

有关在命令行管理程序中使用管道传输的信息和示例,请参阅以下部分:

使用管道传输执行多个操作

使用管道传输处理来自另一个 Cmdlet 的数据

使用管道传输在不同的名词之间传输数据

使用管道传输报告错误

使用管道传输执行多个操作

使用管道传输可将两个或多个 cmdlet 的操作串联在一起,从而使命令行管理程序的功能通过合并而加强,这样您就可以将较小的组件转换为功能更强大的命令。例如,可以使用一个 cmdlet 收集数据,然后将这些数据传递给第二个 cmdlet 将数据筛选为一个子集,然后再将这些数据传递给第三个 cmdlet 以便只处理该子集。

例如,以下命令使用管道传输将 Server1 上的所有邮箱移到 Executives 上的 Server2 数据库,具体做法是通过管道将 Get-Mailbox cmdlet 的输出传递给 Move-Mailbox cmdlet:

Get-Mailbox -Server Server1 | Move-Mailbox -TargetDatabase Executives
使用管道传输处理来自另一个 Cmdlet 的数据

还可以使用管道传输对 cmdlet 输出的数据进行处理。例如,要获得进程 HandleCount 属性大于 400 的所有进程的列表,可以运行以下命令:

Get-Process | Where { $_.HandleCount -gt 400 } | Format-List

在此示例中,Get-Process cmdlet 将对象传递给 Where-Object cmdlet。Where-Object cmdlet 挑出属性名称为 HandleCount 且值大于 400 的对象。

Aa998260.note(zh-CN,EXCHG.141).gif注意:
WhereWhere-Object cmdlet 的别名。有关详细信息,请参阅别名

在此示例中,HandleCount 属性的开头为 $_ 变量。该变量是由命令行管理程序自动创建的,用于存储当前管道对象。然后,Where-Object cmdlet 将这些对象发送给 Format-List cmdlet 进行显示。

使用结构化对象代替文本是命令行管理程序中最受用户青睐的功能之一。结构化对象的使用为功能强大的合成管理模式的形成奠定了基础。有关结构化对象的详细信息,请参阅结构化数据

使用管道传输在不同的名词之间传输数据

若想要将一个 cmdlet 的数据用于另一个 cmdlet,但管道中前一个 cmdlet 输出的对象不能被下一个 cmdlet 用于确定要操作的对象,此时在不同的名词之间通过管道传输数据十分有用。此情况通常发生于使用某个名词对 cmdlet 中的对象进行管道传输,而预期输出该对象的 cmdlet 所使用的名词却不是同一个这种情况。有关 cmdlet 的详细信息,请参阅Cmdlet

对于未经优化,从而不能在相互之间直接传递对象的 cmdlet,若要在相互间传递数据,您需要通过 ForEach cmdlet 来传递对象。使用 ForEach cmdlet 时,可以直接用 $_ 特殊变量访问对象,并将该对象的属性与第二个 cmdlet 上的参数进行关联。

在以下示例中,Get-Mailbox cmdlet 和 New-InboxRule cmdlet 未经优化,不能在相互间直接发送对象。若要让 New-InboxRule cmdlet 对 Get-Mailbox cmdlet 提供的对象进行操作,需要手动将邮箱对象上的恰当属性与 New-InboxRule cmdlet 上的恰当参数进行关联。为此,可以使用以下命令:

Get-Mailbox | ForEach { New-InboxRule -Name "Mark as Read" -Mailbox $_.Name -From john@contoso.com -MarkAsRead $True}

在此示例中,已知 New-InboxRule cmdlet 需要您指定邮箱,以对该邮箱创建新收件箱规则。还已知 Get-Mailbox cmdlet 输出的对象包含每个被返回邮箱的名称。通过使用 ForEach cmdlet(该 cmdlet 包含对其接收的每个对象要运行的命令),可以访问 $_ 特殊变量,此变量包含管道中的当前对象。可以使用 $_.Name 语法访问当前邮箱对象的 Name 属性。$_.Name 将作为 New-InboxRule cmdlet 的 Mailbox 参数上的参数而被提供,它给该 cmdlet 提供了创建新收件箱规则所需的信息。

Aa998260.note(zh-CN,EXCHG.141).gif注意:
ForEachForEach-Object cmdlet 的别名。有关详细信息,请参阅别名
使用管道传输报告错误

若要报告错误,可以使用错误管道。错误管道允许在命令运行的同时报告错误。不必等到命令运行完后再报告,也不必将错误信息置于标准的结果管道中。Write-Error cmdlet 可将它的参数写入错误管道中。

有关管道传输的详细信息,请在命令行管理程序中运行以下命令:

Get-Help About_Pipeline
详细信息

Page view tracker