2017-05-18 34 views
0

CSVからの特定のHashable値のみを印刷する最良の方法を理解したいと思います。 CSVからのHashTableのPowershell GetEnumerator

CSV

はそうのようにフォーマットされています

Ticket,Last Updated,Priority,Assigned To,Email 
2329,1-12-2017,Medium,Assignee1,[email protected] 
2417,5-23-2016,Low,Assignee1,[email protected] 
2416,4-20-2017,Medium,Assignee2,[email protected] 
2463,8-9-2016,Medium,Assignee2,[email protected] 
2481,3-4-2017,Low,Assignee3,[email protected] 
2499,2-22-2017,Medium,Assignee4,[email protected] 
2500,12-20-2016,High,Assignee5,[email protected] 
2498,11-30-2016,Medium,Assignee5,[email protected] 

を完璧な世界では仮定が、私は(これはなく、ネストされたハッシュテーブル値)CSVヘッダを知らないだろうということです。次のコードで示すようにハッシュテーブルを作成するためにループします。

これは問題なく動作します。問題は、完成した結果から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を追加します。すべてのデータは値の文字列の文字カウントを表す数字に変換されます。 PowerShellのシンプトンであるConvertTo-Htmlの文字列値の問題について多くのことを読んだ後も、私はまだ悩んでいます。合計で

:なぜ最初

  1. (私が望むすべてのものを含めている現在のコードとは異なり)Hashtableの値を除外するコードを取得するにはいいだろう
  2. は、より良い、理解します上記の例では `` ConvertTo-Html`を問題なく使うことができますが、2番目は問題ありません。

ありがとうございます。

:現在、この全体につまずく誰のための

$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 <[email protected]>" 
$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

あなたがここでやろうとしていることをよく理解しているかどうか分かりません。送信するチケットのHTMLレポートを生成すると、Email部分を除いて

$HTML = Import-Csv ".\SpiceWorks_Tickets" | Select-Object * -ExcludeProperty 'Email' | ConvertTo-Html 

Select-Objectと paramを使用すると、完全にメールを除外できます。

ConvertTo-Htmlオブジェクトが正常に動作します、しかし、ハッシュテーブルがないので、代わりに内部データを出力する(Import-Csvはあなたを与えるものである)PsCustomObject、それが変換する方法を知っているオブジェクトのかなり限定されたセットを取り込み、あなたがGroup-Objectの結果の各メンバーをループしたいとは、各値を有効にしたい場合はそれはそれを取得する方法を知っているすべてだ(私はそれはそれで.ToString()を呼び出し信じていることを返す)

として、それはあなたのSystem.Collections.Hashtable+KeyCollectionを与えます独自のHTMLテーブルを使用することができます:

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

複数の電子メールを送信するために編集:あなたは自分のデータから冗長なプロパティを削除することができ

$ImportedCsv | Group-Object -Property Email | ForEach-Object { 
    $ToAddress = $_.Name 
    $Body = $_.Group | Select-Object * -Exclude 'Email' | ConvertTo-Html -Head $HtmlFormat -Body $BodyFormat 
    Send-MailMessage -From $FromAddress -To $ToAddress -Subject $Subject -BodyAsHtml "$Body" -Priority High -SmtpServer $SMTPServer 
} 
+0

あなたの説明については、まず感謝し、すべての意味を理解し始めていると私はそのために近づいている。私はあなたの提案を取って最新の反復でオリジナルの投稿を編集しました。うまくいけば、それはもう少し範囲を提供するでしょう。 'Select-Object * -Exclude 'Email''を使うあなたの提案は完璧に機能しました。ただし、譲受人が自分のチケットのみの書式付きテーブルを取得する代わりに、すべての譲受人が全員のチケットの複数のテーブルを取得しています。また、最終的には、すべてのループで '$ ToAddress'に' $ _。Group.Email'を使用する必要があります。 –

+0

@NickB私は、各グループの結果をグループ化された 'Email'に電子メールで送信するスニペットを追加しました。 – ConnorLSW

+0

は完璧に感謝しました。後世の最後のスクリプトを追加しました。 –

1

foreach ($key in $import.keys) { 
    foreach ($value in $import.$key) { 
     $value.PSObject.Properties.Remove("Email") 
    } 
} 
関連する問題