如何组合两个 Powershell 输出以便在每个输出上运行命令 #2?

如何组合两个 Powershell 输出以便在每个输出上运行命令 #2?

我想合并这些命令Get-userget-casmailbox以便我可以从第一个输出中获取“公司”,并从后者中获取“ActiveSyncStatus”到一个输出中。

我也知道我可以编写一个显式循环来生成所需的结果,但我认为使用 $_. 命令(或类似命令)可以实现更紧凑的语法

有人可以向我展示一个命令,该命令演示了 Get-CasMailbox 使用 $_. 属性提供第二个命令,并最终在命令之间选择某种属性组合的对象?

我之所以问这个问题,是因为我经常需要以这种方式连接命令,而 for 循环非常明确,帮助台很难复制和粘贴。我更希望他们能粘贴一行命令行。

答案1

每次使用Write-Host,杰弗里·斯诺弗都会杀死一只小狗。或者是唐·琼斯?也许他们俩在某种仪式上一起杀死小狗。那会很奇怪。

[PS] C:\>"User1", "User2" | % { [PSObject]@{Name=$_; Company=$(Get-User $_).Company; ActiveSyncEnabled=$(Get-CASMailbox $_).ActiveSyncEnabled} }

Name                           Value
----                           -----
Name                           User1
Company                        Contoso
ActiveSyncEnabled              True
Name                           User2
Company                        Woodgrove
ActiveSyncEnabled              True

编辑:或者这样:

[PS] C:\>Foreach($_ In Get-Mailbox) { [PSObject]@{Name=$_; Company=$(Get-User $_).Company; ActiveSyncEnabled=$(Get-CASMailbox $_).ActiveSyncEnabled} }

Exchange Cmdlets 处理管道输入的方式让你措手不及。

如果您希望输出对象看起来不那么拥挤,您可以Format-Table在末尾添加一个,就在最后一个}... 之前。但是,请注意,这Format-*几乎和 一样糟糕Write-Host,因为它能够破坏输出的对象性,因此只能将输出格式化作为您打算做的最后一件事。不要格式化输出,然后尝试将其通过管道传输到另一个 cmdlet。

答案2

我从未使用过PowerShellExchange而且由于我不熟悉这些cmdlet及其输出,我相信这一行代码接近您想要的内容:

Get-User | foreach { $a = $_.property1; $b = Get-CASMailbox -SomeProperty $_.property2; Write-Host "$a | $b" }

相关内容