Powershell:使用-notcontains比较数组不会找到不匹配的值

时间:2013-03-19 20:55:01

标签: arrays powershell contains

PS noob在这里(很快就会很明显),但努力变得更好。在我的Exchange 2010环境中,我导入和导出了大量的.pst文件。许多人将随机排队,一旦他们不在队列中,对源文件进行排序以确定哪些需要再次运行是非常繁琐的,因此我正在尝试编写脚本来执行此操作。

首先我在pst文件列表上运行一个目录,并使用相关的帐户别名填充变量:

$vInputlist = dir $vPath -Filter *.pst |%{ get-mailbox -Identity $_.basename| select alias}

然后我用一个成功排队的所有文件/帐户的别名填充变量:

$vBatch = foreach ($a in (Get-MailboxImportRequest -BatchName $vBatchname)) {get-mailbox $a.mailbox | select alias}

然后我比较两个数组,看看我需要再次排队的文件:

foreach($should in $vInputlist){if ($vBatch -notcontains $should){Write-Host $should ""}}

似乎很简单但是数组中的值永远不会匹配或不匹配,视情况而定。我试过了-contains和-notcontains。我已经进行了一些健全性检查,例如将变量导出到屏幕和/或csv文件,数据看起来很好。

例如,当首次填写$ vInputlist时,我将其发送到屏幕,它看起来像这样:

Alias
MapiEnableTester1.psiloveyou.com
MapiEnableTester2.psiloveyou.com
MapiEnableTester3.psiloveyou.com
MapiEnableTester4.psiloveyou.com

然而,我上面显示的最后一行代码(.. write-host $ should,“”)将输出:     @ {别名= MapiEnableTester1.psiloveyou.com}     @ {别名= MapiEnableTester2.psiloveyou.com}     @ {别名= MapiEnableTester3.psiloveyou.com}     @ {别名= MapiEnableTester4.psiloveyou.com}

(那些都显示为一列,不知道为什么他们不会在这里显示那样)

我尝试过像这样声明数组,$ vInputlist = @()

我尝试过而不是使用.replace

来搜索别名只是清除.pst关闭$ _。basename

我搜索了比较数组,直到我的手指是蓝色的,我不认为我的比较是错误的,我相信无论如何我填写这些变量我正在腐败或改变数据以便看似匹配数据根本就没有。

非常感谢任何帮助。 TIA

1 个答案:

答案 0 :(得分:1)

使用-contains来比较对象并不容易,因为即使对象具有相同的相同属性,对象也永远不会相同。当您使用select alias时,您会获得一系列包含属性alias的pscustomobject。

尝试使用-expand中的select参数,例如

select -expand alias

使用-expand将提取别名属性的值,而您的列表将是两个字符串数组,可以使用-contains-notcontains进行比较。

更新我添加了一个示例,向您展示代码的动态。

#I'm creating objects that are EQUAL to the ones you have in your code
#This will simulate the objects that get through the "$vbatch -notcontains $should" test
PS > $arr = @()
PS > $arr += New-Object psobject -Property @{ Alias="MapiEnableTester1.psiloveyou.com" }
PS > $arr += New-Object psobject -Property @{ Alias="MapiEnableTester2.psiloveyou.com" }
PS > $arr += New-Object psobject -Property @{ Alias="MapiEnableTester3.psiloveyou.com" }
PS > $arr | ForEach-Object { Write-Host $_ }

@{Alias=MapiEnableTester1.psiloveyou.com}
@{Alias=MapiEnableTester2.psiloveyou.com}
@{Alias=MapiEnableTester3.psiloveyou.com}

#Now this is what you will get if you use "... | select -expand alias" instead of "... | select alias"
PS > $arrWithExpand = $arr | select -expand alias
PS > $arrWithExpand | ForEach-Object { Write-Host $_ }

MapiEnableTester1.psiloveyou.com
MapiEnableTester2.psiloveyou.com
MapiEnableTester3.psiloveyou.com