【发布时间】:2017-05-18 14:45:21
【问题描述】:
我想了解仅打印来自 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 中的一个傻瓜,我仍然被卡住了。
总之:
- 如果能获得排除 Hashtable 值的代码(这与包含我想要的所有内容的当前代码不同),那就太好了
- 更好地理解为什么上面的第一个示例可以毫无问题地使用“ConvertTo-Html”,而第二个则不会。
谢谢。
更新的完整脚本:
下面对康纳的评论中描述了当前存在的问题
$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 "<","<" -replace """,'"' -replace ">",">"
$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 "<","<" -replace """,'"' -replace ">",">"
$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;}
【问题讨论】:
标签: powershell