[英]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.