我想了解仅打印来自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中的一个简单例子,我仍然被卡住了。
总结:
感谢。
更新了完整脚本:
目前在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 "<","<" -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;}
答案 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")
}
}