2013-09-06 4 views
1

Я уверен, что это очень просто, но сегодня у меня все получилось лучше (я относительно новичок в Powershell). Кроме того, я уверен, что мой код может быть более элегантным.PowerShell: разделительный массив, содержащий массив

Для начала у меня есть код, который идет на наши серверы обмена, и возвращает отправленные сообщения от конкретного пользователя. Он помещает это в массив, называемый @Results. Таким образом, несколько записей будут выглядеть так (отредактировано для конфиденциальности):

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

Timestamp   MessageSubject  Recipients 
---------   --------------  ---------- 
01/09/2013 09:12:57 Subject1  {[email protected]} 
01/09/2013 09:30:44 Subject2  {[email protected]} 
01/09/2013 09:42:11 Subject3  {[email protected], [email protected] 

Итак, я доволен этим. Однако моя проблема связана с несколькими списками получателей выше. Фактически, это его собственный массив. Из списка отправленной почты меня не интересует внутренняя почта, поэтому я хотел бы исключить записи в нашем домене (скажем, это 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 
     } 
    } 

Это работает, но использует пару петель, которые, как я считаю, неэлегантны. Должен быть более аккуратный способ достижения вышеуказанного (возможно, для каждой команды?). Моей главной проблемой является, однако, что делать с выходом. Я не хочу использовать «write-host» и предпочел бы создавать выходы как объекты, которые я могу затем добавить в таблицу или создать csv. Затем я могу использовать функцию «Кому-объект ToUpper (Получатели)), а не функцию« *@GLOBOCORP.COM », чтобы исключить внутреннюю почту.

Однако, я не могу просто перечислить выход, затем передать его, как я получаю «пустой элемент трубы не допускается» ошибка, и список из объектов прилипает каждую запись на новой строке, то есть:

04 September 2013 18:19:12 
[email protected] 
Message subject 

Любой совет очень ценится!

ответ

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

Это в значительной степени то же самое, что вы сделали, за исключением он использует силу ТРУБЫ с Еогеасп-ков и где-тов. Создание пользовательских объектов довольно просто с помощью ускорителя [PSCustomObject]. Он принимает хеш-таблицу. Теперь вы должны иметь возможность экспортировать в cvs, просто добавьте это в конец | Exprot-CSV C:\foo.csv

Надеюсь, это поможет. Get great PS tips here.

0

Нечто подобное может работать:

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

Я хотел бы создать (на самом деле воссоздать) уплощенный объект так:

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

В конце этого вы получите (ряд) новый объект для каждого получателя, исключая внутреннюю электронную почту.

Если вы ожидаете, что количество результатов, чтобы быть достаточно большим, так что вы можете столкнуться с проблемами памяти, то вы могли бы избежать Еогеасп и вместо того, чтобы использовать «трубу» проигрывая по скорости:

$Results| % { 
    $result = $_; 
    foreach ($recipient in $result.$recipients) { 
     if ($recipient -notmatch '@globalcorp.com') { 
      [PSCustomObject]@{ 
       TimeStamp = $result.timestamp; 
       MessageSubject = $result.MessageSubject; 
       Recipient = $recipient 
      } 
     } 
    } 
} 
Смежные вопросы