簡體   English   中英

PowerShell:拆分包含數組的數組

[英]PowerShell: split out array containing array

我敢肯定這很簡單,但是今天下午對我有好處(我對Powershell還是比較陌生)。 另外,我很確定我的代碼可以更優雅。

首先,我將一些代碼發送到我們的交換服務器,並返回來自特定用戶的已發送消息。 它將其放入名為@Results的數組中。 因此,一些條目將如下所示(針對隱私進行了編輯):

C:\Windows\system32>$Results[3..5]

Timestamp         MessageSubject        Recipients
---------         --------------        ----------
01/09/2013 09:12:57   Subject1      {user1@gmail.com}
01/09/2013 09:30:44   Subject2      {recipient@yahoo.com}
01/09/2013 09:42:11   Subject3      {person1@globocorp.com, recipient2@gmail...

所以,我對此很滿意。 但是,我的問題是上面的多個收件人列表。 實際上,這是它自己的數組。 從已發郵件列表中,我對內部郵件不感興趣,因此我想排除其中包含我們域的條目(例如,上面的globocorp.com)。 因此,我的解決方案是讓幾個循環將所有條目列出為自己的行。 這是我必須去的地方:

For ($k=0; $k -eq $Results.count; $k++)
    {
    For ($j=0; $j -eq $Results[$k].Recipients.Count; $j++)
        {write-host $Results[$k].timestamp, $Results[$k].Recipients[$j], $Results[$k].MessageSubject 
        }
    }

這可行,但是使用了幾個循環,我認為這是不雅的。 必須有一種更簡潔的方法來實現上述目的(也許是for-each命令?)。 但是,我的主要問題是如何處理輸出。 我不想使用“寫主機”,而是希望將輸出創建為對象,然后可以將其制成表格或從中創建csv。 然后,我可以使用“ where-object ToUpper(Recipients)-notlike“ *@GLOBOCORP.COM”“功能排除內部郵件。

但是,我不能只列出輸出,然后在收到“不允許使用空管道元素”錯誤時進行管道傳輸,並且列出對象會將每個條目粘貼在新行上,即:

04 September 2013 18:19:12
user@globocorp.com
Message subject

任何建議,不勝感激!

$Results | 
Foreach-Object {$Entry=$_;$Entry.Recipeints |
    Where-Object {$_ -notlike '*@globocorp.com'} | 
    Foreach-Object {Write-Output ([PSCustomObject]@{TimeStamp=$Entry.TimeStamp;MessageSubject=$Entry.MessageSubject;Recipeint=$_)}}
}

除了將PIPE的功能與foreach-ing和where-ing結合使用外,其他操作幾乎與您相同。 只需使用[PSCustomObject]加速器即可輕松創建自定義對象。 它需要一個哈希表。 現在,你應該能夠出口到CVS,只是在末尾添加此| Exprot-CSV C:\\foo.csv | Exprot-CSV C:\\foo.csv

希望這可以幫助。 在此處獲取出色的PS提示

這樣的事情可能會起作用:

$Results | % {
  foreach ($recipient in $_.Recipients) {
    if ($recipient -notlike '*@globocorp.com') {
      Write-Host $_.Timestamp, $recipient, $_.MessageSubject
    }
  }
}

或像這樣:

$Results | % {
  $timestamp = $_.Timestamp
  $subject   = $_.MessageSubject
  $_.Recipients | ? { $_ -notlike '*@globocorp.com' } | % {
    Write-Host $timestamp, $_, $subject
  }
}

我將創建(實際上是重新創建)如下所示的展平對象:

Foreach ($result in $Results) { 
    foreach ($recipient in $result.recipients) {
        if ($recipient -notmatch '@globalcorp.com') {
            [PSCustomObject]@{
                TimeStamp = $result.timestamp;
                MessageSubject = $result.MessageSubject;
                Recipient = $recipient 
            }
        }
    }
}

最后,您將為每個收件人(不包括內部電子郵件)創建一個(一系列)新對象。

如果您期望結果的數量很大,以便遇到內存問題,那么您可以避免使用foreach,而是使用“ pipe”降低速度:

$Results| % { 
    $result = $_;
    foreach ($recipient in $result.$recipients) {
        if ($recipient -notmatch '@globalcorp.com') {
            [PSCustomObject]@{
                TimeStamp = $result.timestamp;
                MessageSubject = $result.MessageSubject;
                Recipient = $recipient 
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM