首页 > 解决方案 > Powershell如何从另一个变量中减去一个变量,两者都包含Exchange邮箱对象标识

问题描述

我有两个变量都包含用户帐户的Get-Mailbox对象"Identity"。我需要从另一个 IE 中减去一个的内容:

$termednofwd = (domain.local/OUname/SubOU/Users/first1 last1, domain.local/OUname/SubOU/first2 last2)

$termedfmr = (domain.local/OUname/SubOU/Users/first1 last1)

我想要一些可以$termedfmr$termednofwd给出如下内容中减去的内容。Compare-Object只列出两者中的内容,我基本上需要从第一个变量中减去两者中的内容。本质上: $termednofwdnofmr = $termednofwd - $termedfmr导致:

$termednofwdnofmr = (domain.local/OUname/SubOU/first2 last2)

标签: powershellsetexchange-server

解决方案


在集合论术语中,您正在寻找两个集合之间的相对补充,这可以提供,尽管它需要额外的努力:Compare-Object

默认情况下,Compare-Object提供两个集合之间的对称差,即列出相对补集的并集;也就是说,给定两个集合 A 和 B,它列出B 中不存在于 A 中的那些元素那些 A 中不存在于 B 中的元素,并且它使用.SideIndicator属性来指示哪个是哪个:

  • '<='表示集合 A 唯一的对象(-ReferenceObject参数,或第一个位置参数),而
  • '=>'表示集合 B 唯一的元素(-DifferenceObject参数,或第二个位置参数)。

因此,您需要按其.SideIndicator值过滤输出对象。
-PassThru开关还确保输入对象被传递(而不是将它们包装在包含它们的[pscustomobject]实例.InputObject中):

$termednofwd = 'domain.local/OUname/SubOU/Users/first1 last1',
               'domain.local/OUname/SubOU/first2 last2'

$termedfmr = 'domain.local/OUname/SubOU/Users/first1 last1'

# Return the elements in $termednofwd that aren't also present in $termedfmr
Compare-Object $termednofwd $termedfmr -PassThru |
  Where-Object SideIndicator -eq '<='

上面的产量'domain.local/OUname/SubOU/first2 last2',即那些$termednofwd不存在于的元素$termedfmr

注意:为简洁起见,以上使用字符串作为输入对象;在您的情况下,由于您正在使用Get-Mailboxcmdlet 返回的对象并希望根据它们的.Identity属性值进行比较,因此您需要使用:

# If you only need the identity values as results.
Compare-Object $termednofwd.Identity $termedfmr.Identity -PassThru |
  Where-Object SideIndicator -eq '<='

# Alternatively, if you need the whole mailbox objects.
Compare-Object -Property Identity $termednofwd $termedfmr -PassThru |
  Where-Object SideIndicator -eq '<='

另请参阅:GitHub 问题 #4316Compare-Object ,它建议使用集合操作进行增强。


推荐阅读