Powershell-将CSV文件作为单独的行读取

Powershell-将CSV文件作为单独的行读取,powershell,Powershell,我有这个powershell脚本来获取一些电子邮件计数,如果csv文件中只有一个用户,这很好,但是当我放置两个或更多用户时,它会将其全部读取为一行,然后我得到一个无效的SMTP地址错误。我一辈子都搞不懂如何让它一行一行地读。有人能看看这个powershell脚本并帮我吗 ############ Start Import the Exchange 2010 modules if available, otherwise import 2007. if (Get-PSSnapin Microso

我有这个powershell脚本来获取一些电子邮件计数,如果csv文件中只有一个用户,这很好,但是当我放置两个或更多用户时,它会将其全部读取为一行,然后我得到一个无效的SMTP地址错误。我一辈子都搞不懂如何让它一行一行地读。有人能看看这个powershell脚本并帮我吗

 ############ Start Import the Exchange 2010 modules if available, otherwise import 2007.
if (Get-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -Registered -ErrorAction SilentlyContinue) {
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
} else {
    Add-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.Admin
}

############ Start Variables
[Int] $intSent = $intRec = 0
$emails = Get-Content "C:\Test.csv"
$dt = (get-date).adddays(-1)
$tab2 = @()
$tabInfo = @()
############ End variables

############ Start HTML Style
$head = @'
<style>
body { background-color:#FFFFFF;
       font-family:Tahoma;
       font-size:11pt; }
td, th { border:1px solid black; 
         border-collapse:collapse;
         text-align:center;
         background+color:#e0e0e0;
         width:300px;}
th { color:#ffffff;
     background-color:#20a000;
     text-align:center;}
table, tr, td, th { padding: 1px; margin: 0px }
table { margin-left:15px; }
</style>
'@
############ End HTML Style

############ Start retrieve email address + NB sent/received mails
foreach ($i in $emails) {

$intRec = 0                       #Number of received mails
$intSent = 0                      #Number of sent mails
$intTotalSentInt = 0              #Number of sent internal mails
$intTotalSentExt = 0              #Number of sent external mails
$intTotalRecInt = 0               #Number of received internal mails
$intTotalRecExt = 0               #Number of received external mails
$address = $emails                #Email address
$object = new-object Psobject     #Create the object
$objectInfo = new-object Psobject  #Create the object info

############ Sent mails
Get-TransportService | Get-MessageTrackingLog -ResultSize Unlimited -Start $dt -Sender $emails -EventID RECEIVE | ? {$_.Source -eq "STOREDRIVER"} | ForEach {

    If ($_.Recipients -match "domain.com") {
                $intTotalSentInt++
}

    If ($_.Recipients -notmatch "domain.com") {
                $intTotalSentExt++
    }
}

############ Received mails
Get-TransportService | Get-MessageTrackingLog -ResultSize Unlimited -Start $dt -Recipients $emails -EventID DELIVER | ForEach {

    If ($_.Sender -match "domain.com") {
                $intTotalRecInt += [Int] $_.RecipientCount
                } Else {
                # From an external sender
                $intTotalRecExt += [Int] $_.RecipientCount
    }
}

############ Insert address + number of sent/received mails
$object | Add-member -Name "User" -Membertype "Noteproperty" -Value $emails
$object | Add-member -Name "Internal Emails Sent" -Membertype "Noteproperty" -Value $IntTotalSentInt
$object | Add-member -Name "External Emails Sent" -Membertype "Noteproperty" -Value $IntTotalSentExt
$object | Add-member -Name "Internal Emails Received" -Membertype "Noteproperty" -Value $intTotalRecInt
$object | Add-member -Name "External Emails Received" -Membertype "Noteproperty" -Value $intTotalRecExt

$tab2 += $object
}

############ Sort by number of sent emails
$tab2 = $tab2 | Sort-Object Sent -descending

############ ConvertTo-HTML
$body =  $tabInfo | ConvertTo-HTML -head $head
$body += $tab2 | ConvertTo-HTML -head $head

############ Send emails with results
send-mailmessage -to "email@domain.com" -from "email@domain.com" -subject "Emails Sent and Received from $dt" -body ($body | out-string) -BodyAsHTML -SmtpServer "x.x.x.x"

############ end of Script
开始导入Exchange 2010模块(如果可用),否则导入2007。
如果(在Microsoft.Exchange.Management.PowerShell.E2010中获取PSSnapin-已注册-错误操作SilentlyContinue){
在Microsoft.Exchange.Management.PowerShell.E2010中添加PSSnapin
}否则{
添加PSSnapin-名称Microsoft.Exchange.Management.PowerShell.Admin
}
############起始变量
[Int]$intSent=$intRec=0
$emails=获取内容“C:\Test.csv”
$dt=(获取日期).adddays(-1)
$tab2=@()
$tabInfo=@()
############结束变量
############启动HTML样式
$head=@'
正文{背景色:#FFFFFF;
字体系列:Tahoma;
字体大小:11pt;}
td,th{边框:1px纯黑色;
边界塌陷:塌陷;
文本对齐:居中;
背景+颜色:#E0;
宽度:300px;}
颜色:#ffffff;
背景色:#20a000;
文本对齐:居中;}
表,tr,td,th{padding:1px;margin:0px}
表{左边距:15px;}
'@
############结束HTML样式
############开始检索电子邮件地址+NB已发送/已接收邮件
foreach($电子邮件中的i){
$intRec=0#收到的邮件数
$intSent=0#已发送邮件数
$intTotalSentInt=0#已发送的内部邮件数
$intTotalSentExt=0#已发送的外部邮件数
$intTotalRecInt=0#收到的内部邮件数
$intTotalRecExt=0#收到的外部邮件数
$address=$emails#电子邮件地址
$object=新建对象Psobject#创建对象
$objectInfo=新建对象Psobject#创建对象信息
############发送邮件
Get-TransportService | Get-MessageTrackingLog-ResultSize Unlimited-Start$dt-Sender$emails-EventID RECEIVE |?{$\源代码-eq“STOREDRIVER”}ForEach{
If($\收件人-匹配“domain.com”){
$intTotalSentInt++
}
If($\收件人-不匹配“domain.com”){
$intTotalSentExt++
}
}
############收到邮件
Get-TransportService | Get-MessageTrackingLog-ResultSize Unlimited-Start$dt-Recipients$emails-EventID DELIVER | ForEach{
If($\u.Sender-匹配“domain.com”){
$IntTotalRecent+=[Int]$\收件人计数
}否则{
#来自外部发送者
$intTotalRecExt+=[Int]$\ RecipientCount
}
}
############插入地址+发送/接收邮件的数量
$object |添加成员-名称“User”-成员类型“Noteproperty”-值$email
$object |添加成员-名称“已发送内部电子邮件”-成员类型“Noteproperty”-值$IntTotalSentInt
$object |添加成员-名称“已发送的外部电子邮件”-成员类型“Noteproperty”-值$IntTotalSentExt
$object |添加成员-名称“收到的内部电子邮件”-成员类型“Noteproperty”-值$IntTotalRecent
$object |添加成员-名称“收到的外部电子邮件”-成员类型“Noteproperty”-值$IntTotalRecText
$tab2+=$object
}
############按发送电子邮件的数量排序
$tab2=$tab2 |已发送的排序对象-降序
############转换为HTML
$body=$tabInfo |转换为HTML-head$head
$body+=$tab2 |转换为HTML-head$head
############发送带有结果的电子邮件
发送邮件消息-发送至“email@domain.com“-来自”email@domain.com“-主题“从$dt发送和接收的电子邮件”-正文($body | out string)-正文HTML-SmtpServer“x.x.x.x”
############脚本结束

第45行,在
foreach($i in$emails)
中,您正在执行
$address=$emails
,它将整个电子邮件列表放在
$address
中。我猜你的意思是
$address=$I


编辑:我错过了可能是有问题的第50行,您正在传递
$emails
,这是一个数组,而
-Sender
接受一个字符串。

显示
C:\Test.csv
文件的前4或5行(当然已清理。您现在正在使用
Get Content
阅读此内容,这将为您提供一个字符串数组。您可能需要使用
Import Csv
,但要明确回答此问题,我们需要知道原始消息中的Csv看起来是什么样子。当您执行
$object>时,添加成员-名称“User”-成员类型“Noteproperty”-Value$emails
您在那里输入了整个数组
$emails
。相反,您应该使用用于在emails数组上迭代的变量,在您的情况下,
$i
(注意,这是一个非常糟糕的名称。$i通常用于($i=0;$i-lt$someArray;$i++)在编号循环中迭代。但是,您使用的是foreach循环,因此我建议将其更改为类似于
foreach($email中的userEmail)
,然后将其设置为
$object |添加成员-名称“User”-成员类型“Noteproperty”-值$userEmail
非常感谢!这是此建议和anto418建议的组合,但我们现在正在工作!