【问题标题】:Powershell: Using -notcontains to compare arrays doesn't find non-matching valuesPowershell:使用 -notcontains 比较数组找不到不匹配的值
【发布时间】:2013-03-08 18:17:32
【问题描述】:

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} @{Alias=MapiEnableTester4.psiloveyou.com}

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

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

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

我已经搜索了比较数组,直到我手指发青,我认为我的比较没有错,我相信无论我如何填充这些变量,我都会破坏或更改数据,因此看起来匹配数据根本没有。

任何帮助将不胜感激。 TIA

【问题讨论】:

    标签: arrays powershell contains


    【解决方案1】:

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

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

    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
    

    【讨论】:

    • 非常感谢您的回复。当我尝试它时,我的“健全性检查”csvs 在所有列中都有“32”,所以我得到的属性似乎是长度。您为我提供了另一种工作途径,因此我想自己尝试更长的时间来解决这个问题。我只是不想让你认为我没有看到或感谢你的帮助。非常感谢,有更多信息我会在这里更新。
    • 我真的不明白你在这里想说什么。你得到Length 而不是Alias? :S 我已经更新了答案以包含一个示例,您可以在其中了解您的代码 atm 有什么问题,以及为什么 -expand 会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多