来自CSV

时间:2017-05-18 14:45:22

标签: powershell

我想了解仅打印来自CSV的特定Hashable值的最佳方法。

CSV的格式如下:

Ticket,Last Updated,Priority,Assigned To,Email
2329,1-12-2017,Medium,Assignee1,assignee1@domain.tld
2417,5-23-2016,Low,Assignee1,assignee1@domain.tld
2416,4-20-2017,Medium,Assignee2,assignee2@domain.tld
2463,8-9-2016,Medium,Assignee2,assignee2@domain.tld
2481,3-4-2017,Low,Assignee3,assignee3@domain.tld
2499,2-22-2017,Medium,Assignee4,assignee4@domain.tld
2500,12-20-2016,High,Assignee5,assignee5@domain.tld
2498,11-30-2016,Medium,Assignee5,assignee5@domain.tld

在一个完美的世界中,假设我不知道CSV标头(因此不知道嵌套的散列表值)。我将循环创建哈希表,如下面的代码所示:

$import = Import-Csv -Path .\import.csv|
    Group-Object -Property Email -AsHashTable
foreach ($i in $import.GetEnumerator()){
    $html = $($i.Value) | ConvertTo-Html -Head $htmlformat -Body $bodyformat
    $html | Write-Host
}

这很好用。问题是我想从完成的结果中排除Email值。

所以我认为,虽然不理想,但我知道这个CSV的列标题总是会是什么,所以这会有用吗?:

$import = Import-Csv -Path .\import.csv|
    Group-Object -Property Email -AsHashTable
foreach ($i in $import.GetEnumerator()){
    $html = $($i.Value.'Ticket') + $($i.Value.'Last Updated') + $($i.Value.'Priority') + $($i.Value.'Assigned To') 
    $html | Write-Host
}

您可以看到上面的代码仍对Group-Object属性使用Email,但从输出中排除。然而,第二个我添加| ConvertTo-Html -Head $htmlformat -Body $bodyformat我的所有数据都转向数字,表示值中字符串的字符数。即使在阅读了很多关于字符串值的ConvertTo-Html问题之后,作为PowerShell中的一个简单例子,我仍然被卡住了。

总结:

  1. 获取排除Hashtable值的代码(不同于包含我想要的所有内容的当前代码)会很高兴。
  2. 明白,为什么上面的第一个例子可以毫无问题地使用``ConvertTo-Html`,但第二个例子不会。
  3. 感谢。

    更新了完整脚本:

    目前在Conner的评论中描述的问题

    $htmlformat  = '<title>Stale Tickets</title>'
    $htmlformat += '<style type="text/css">'
    $htmlformat += "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
    $htmlformat += "TH{border-width: 1px;padding: 7px;border-style: solid;border-color: black;background-color:thistle}"
    $htmlformat += "TD{border-width: 1px;padding: 7px;border-style: solid;border-color: black;background-color:#ffffcc}"
    $htmlformat += '</style>'
    $bodyformat = '<h3></h3>'
    $notice = "<font color='red'><b>This is an automated message.</b></font><br />"
    
    $FromAddress    = "Spiceworks <noreply@domain.tld>"
    $ToAddress      = "<My email address for now>"
    $Subject        = "You have stale tickets!"
    $SMTPserver     = "smtp.whatever.com"
    
    if ((Get-Item "spiceworks_stale_open_ticket_alert.csv").length -gt 0kb)
        {
        $html = Import-Csv -Path .\spiceworks_stale_open_ticket_alert.csv|
        Group-Object -Property Email | ForEach-Object {
            $_.Group | Select-Object * -Exclude 'Email','Assigned To' | ConvertTo-Html -Head $htmlformat -Body $bodyformat
            $html = $html -replace "&lt;","<" -replace "&quot;",'"' -replace "&gt;",">"
            $body = $notice + $html
            Send-MailMessage -from $FromAddress -to $ToAddress -subject $Subject -bodyashtml ($body | Out-String) -priority High -smtpServer $SMTPserver        
            }
    
        }
    else {exit;}
    

    任何偶然发现错误的人的最终工作迭代:

    if ((Get-Item "import.csv").length -gt 0kb)
        {
            Import-Csv -Path .\import.csv|
                Group-Object -Property Email|
                ForEach-Object {
                    $Html = $_.Group | Select-Object * -Exclude 'Email','Assigned To' | ConvertTo-Html -Head $HtmlFormat -Body $BodyFormat
                    $Html = $Html -replace "&lt;","<" -replace "&quot;",'"' -replace "&gt;",">"
                    $Body = $notice + $Html + $notice2
                    $Subject        = "Inactive Tickets for " + $_.Group[0].'Assigned To'
                    $ToAddress = $_.Name
                    Send-MailMessage -from $FromAddress -to $ToAddress -subject $Subject -BodyAsHtml ($Body | Out-String) -Priority High -SmtpServer $SMTPServer
                }   
        }
    else {exit;}
    

2 个答案:

答案 0 :(得分:2)

我不确定我是否完全明白你要在这里做什么,如果你想要生成一个要发送的门票的HTML报告,那么应该这样做({{1}除外)部分)

Email

使用$HTML = Import-Csv ".\SpiceWorks_Tickets" | Select-Object * -ExcludeProperty 'Email' | ConvertTo-Html Select-Object参数可以让您完全省略电子邮件。

-ExcludeProperty对象接收一组非常有限的对象,它知道如何转换,ConvertTo-Html(这是PsCustomObject给你的)将正常工作,但是Hashtable不会,所以不是输出内部数据,它会给你Import-Csv,因为它知道如何获取(我相信它只是调用System.Collections.Hashtable+KeyCollection并返回它)

如果您想循环遍历.ToString()结果的每个成员并将每个Value转换为自己的HTML表格,那么您可以使用它:

Group-Object

编辑以发送多封电子邮件:

$ImportedCsv | Group-Object -Property Email | ForEach-Object {
    $_.Group | Select-Object * -Exclude 'Email' | ConvertTo-Html
}

答案 1 :(得分:1)

您可以从数据中删除冗余属性:

foreach ($key in $import.keys) {
    foreach ($value in $import.$key) {
        $value.PSObject.Properties.Remove("Email")
    }
}