0

PS ここでは初心者ですが(すぐに明らかになります)、改善するために一生懸命努力しています. 私の Exchange 2010 環境では、膨大な数の .pst ファイルをインポートおよびエクスポートしています。多くはランダムにキューに入れられず、キューに入れられなくなると、ソース ファイルを並べ替えて、再実行する必要があるファイルを判断するのは非常に面倒なので、それを行うスクリプトを作成しようとしています。

最初に、pst ファイルのリストに対して dir を実行し、関連するアカウントのエイリアスを変数に入力します。

$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}

次に、2 つの配列を比較して、再度キューに入れる必要があるファイルを確認します。

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 を消去してみました

指が青くなるまで配列の比較を検索しましたが、比較が間違っているとは思いません。これらの変数をどのように入力しても、データを破損または変更しているように見えるため、データが単純に一致しているように見えますしません。

どんな助けでも大歓迎です。ティア

4

1 に答える 1

1

を使用-containsしてオブジェクトを比較するのは簡単ではありません。オブジェクトは、同じ値を持つ同じプロパティを持っていても決して同一ではないからです。を使用select aliasすると、プロパティを持つ pscustomobjects の配列を取得しますalias

のように-expandパラメータを使用してみてくださいselect

select -expand alias

を使用-expandするとエイリアス プロパティの値が抽出され、リストは文字列の 2 つの配列になり、 と を使用して比較でき-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
于 2013-03-19T21:11:54.510 に答える