0

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,"") 将输出:@{Alias=MapiEnableTester1.psiloveyou.com} @{Alias=MapiEnableTester2.psiloveyou.com} @{Alias=MapiEnableTester3 .psiloveyou.com} @{Alias=MapiEnableTester4.psiloveyou.com}

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

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

我尝试过使用 .replace 清除 $_.basename 中的 .pst 而不是搜索别名

我已经搜索了比较数组,直到我手指发青,我认为我的比较没有错,我相信无论我如何填充这些变量,我都会破坏或更改数据,以便看似简单地匹配数据没有。

任何帮助将不胜感激。TIA

4

1 回答 1

1

用于-contains比较对象并不容易,因为对象永远不会相同,即使它们具有相同的属性和相同的值。当你使用时,select alias你会得到一个带有属性的 pscustomobjects 数组alias

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

select -expand alias

Using-expand将提取 alias 属性的值,而您的列表将是两个字符串数组,可以使用-containsand进行比较-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
于 2013-03-19T21:11:54.510 回答