2017-12-06 29 views
0

私の目標は、CSVのヘッダであるファイル名とデバイス名の2つの列をキャプチャして、URLから脅威データを含むCSVをダウンロードすることです。そのデータを電子メールで1行にエクスポートし、セキュリティチームの2人のメンバーにプレインテキスト形式で確認します。目標は、CSVに無関係のデータがたくさんあるため、CSVからペーストを直接ダウンロードしてコピーする必要がないようにすることです。Powershell - CSVデータをテーブルにメールで送信

これはかなり簡単なスクリプトなので、すべて正常に動作します。私の質問です:どのように私はcsvからデータの2つの列を引っ張って、電子メール本文に書き込むのですか?理想的には、ある種のテーブルでは、2つの列が一列に並んでいます。

は、私が最も顕著なのは、オンラインのHTMLにオブジェクト(表)を変換、PowerShellのインターフェースから任意のオブジェクトを受け取り、その後、電子メールでそれを送信するスクリプトをいくつかのリソースを見つけた:以来、完璧ですhttps://gallery.technet.microsoft.com/scriptcenter/bd0c8d87-466f-4488-92a2-0f726cb6f4cd

これはまさに私がやりたいことです。私は、CSVからpowershell関数にデータを正しく渡す方法が本当にわかりません。

これはPowerShellの私の最初のプロジェクトでもあり、テクニカルドキュメントとオンラインで見つかったコード例のスクラップから、私はジュニアシステム管理者ですので、プログラミングのバックグラウンドはあまりありません。

ありがとうございます! 1

アップデートだからこの時期に少しより多くの成功を得ることができたが、残念ながら電子メールで送信出力がCSV内で見つかった任意のデータに対応していない番号の文字化けリストがあります。

私はエラーがどこかここであるかなり確信しているが、私は、私は失敗してるところはかなりよく分からない:

$csv = Import-Csv $output | Select "File Name",DeviceName | ConvertTo-Html 

私のコードの残りの部分は以下の通りです:

<# 
.SYNOPSIS 
Send an email with an object in a pretty table 
.DESCRIPTION 
Send email 
.PARAMETER InputObject 
Any PSOBJECT or other Table 
.PARAMETER Subject 
The Subject of the email 
.PARAMETER To 
The To field is who receives the email 
.PARAMETER From 
The From address of the email 
.PARAMETER CSS 
This is the Cascading Style Sheet that will be used to Style the table 
.PARAMETER SmtpServer 
The SMTP relay server 
.EXAMPLE 
PS C:\> Send-HtmlEmail -InputObject (Get-process *vmware* | select CPU, WS) -Subject "This is a process report" 
An example to send some process information to email recipient 
.NOTES 
NAME  : Send-HtmlEmail 
VERSION  : 1.1.0 
LAST UPDATED: 01/03/2013 
AUTHOR  : Milo 
.INPUTS 
None 
.OUTPUTS 
None 
#> 

function Send-HTMLEmail { 
#Requires -Version 2.0 
[CmdletBinding()] 
Param 
    ([Parameter(Mandatory=$True, 
       Position = 0, 
       ValueFromPipeline=$true, 
       ValueFromPipelineByPropertyName=$true, 
       HelpMessage="Please enter the Inputobject")] 
    $InputObject, 
    [Parameter(Mandatory=$True, 
       Position = 1, 
       ValueFromPipeline=$true, 
       ValueFromPipelineByPropertyName=$true, 
       HelpMessage="Please enter the Subject")] 
    [String]$Subject,  
    [Parameter(Mandatory=$False, 
       Position = 2, 
       HelpMessage="Please enter the To address")]  
    [String[]]$To = "[email protected]", 
    [String]$From = "[email protected]",  
    [String]$CSS, 
    [String]$SmtpServer ="smtp.klick.com" 
    )#End Param 

if (!$CSS) 
{ 
    $CSS = @" 
     <style type="text/css"> 
      table { 
      font-family: Verdana; 
      border-style: dashed; 
      border-width: 1px; 
      border-color: #FF6600; 
      padding: 5px; 
      background-color: #FFFFCC; 
      table-layout: auto; 
      text-align: center; 
      font-size: 8pt; 
      } 

      table th { 
      border-bottom-style: solid; 
      border-bottom-width: 1px; 
      font: bold 
      } 
      table td { 
      border-top-style: solid; 
      border-top-width: 1px; 
      } 
      .style1 { 
      font-family: Courier New, Courier, monospace; 
      font-weight:bold; 
      font-size:small; 
      } 
      </style> 
"@ 
}#End if 

$HTMLDetails = @{ 
    Title = $Subject 
    Head = $CSS 
    } 

$Splat = @{ 
    To   =$To 
    Body  ="$($InputObject | ConvertTo-Html @HTMLDetails)" 
    Subject =$Subject 
    SmtpServer =$SmtpServer 
    From  =$From 
    BodyAsHtml =$True 
    } 
    Send-MailMessage @Splat 

}#Send-HTMLEmail 


#Defines variables 
$url = "https://protect.cylance.com/Reports/ThreatDataReportV1/threats/BE5ABB1717DB46978BED0AF14A308557" 
$output = "$PWD\ThreatsDataReport.csv" 

(New-Object System.Net.WebClient).DownloadFile($url, $output) 
#Downloads the CSV from $url and saves it to $output 

$csv = Import-Csv $output | Select "File Name",DeviceName | ConvertTo-Html 

Send-HTMLEmail -InputObject ($csv) -Subject "Cylance: Weekly Summary" 

オリジナルコード

$url = "foo.com/directlinktocsv" 
$output = "$PSScriptRoot\ThreatsDataReport.csv" 
$emailSMTPServer = "smtp.mydomain.com" 
$emailFrom = "[email protected]" 
$emailRecipients = @("Foo <[email protected]>", "Bar <[email protected]>") 
$emailSubject = "Cylance Detected Threats" 
$emailBody = "This is where I want my output to go" 

(New-Object System.Net.WebClient).DownloadFile($url, $output) 

$csv = Import-Csv $output 

    $csv."File Name" | ForEach-Object { 
    $_ 


    } 

    $csv.DeviceName | ForEach-Object { 

    $_ 

    } 


Send-MailMessage -From $emailFrom -To $emailRecipients -SmtpServer $emailSMTPServer -subject $emailSubject -Body $emailBody 

答えて

0

あなただけのこれらの列名を持つCSVファイルから最初の行をしたい場合は、THIのような何かを行うことができますS:

これに対する答えを思い付くために管理
$emailBody = Import-Csv $output | 
    Select-Object "File Name",DeviceName | 
    Format-Table -AutoSize | Out-String 
$params = @{ 
    "From"  = $emailFrom 
    "To"   = $emailRecipients 
    "SmtpServer" = $emailSMTPServer 
    "Subject" = $emailSubject 
    "Body"  = $emailBody 
} 
Send-MailMessage @params 
+0

ああがあり、これらは一般的に出力されたデータの価値は数十の列を持ってしようとしています。 CSVから最初の行を取得するだけでは、このトリックはできません。 私はHTMLに変換して本文に直接渡す必要があるかもしれないと思います。 – TheIronRose

+0

@TheIronRose更新された回答を参照してください。 –

+0

e:これを主な回答に含めて、心配しないでください – TheIronRose

0

$csv = Import-Csv $output | Select-Object -First 1 
$emailBody = "File Name: {0}`r`nDevice Name: {1}" -f 
    $csv."File Name", $csv.DeviceName 
$params = @{ 
    "From"  = $emailFrom 
    "To"   = $emailRecipients 
    "SmtpServer" = $emailSMTPServer 
    "Subject" = $emailSubject 
    "Body"  = $emailBody 
} 
Send-MailMessage @params 

出力の複数の行をつかむためには、あなたのような何かを行うことができます!

最初にまずリンクからSend-HTMLEmailを削除しました。これは必ずしも必要ではないし、特に有用でもありませんでした。

私の固定、作業コードが

#Defines variables 
$url = "mysite.com/ThreatsDataReport.csv" 
$output = "$PWD\ThreatsDataReport.csv" 
$emailSMTPServer = "smtp.mydomain.com" 
$emailFrom = "[email protected]" 
$emailRecipients = @("Foo <[email protected]>"), "Bar <[email protected]>") 
$emailSubject = "Cylance Reporting" 

(New-Object System.Net.WebClient).DownloadFile($url, $output) 
#Downloads the CSV from $url and saves it to $output 

#Sets HTML Head Information 
$a = "<style>" 
$a = $a + "BODY{background-color:peachpuff;}" 
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}" 
$a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:thistle}" 
$a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:palegoldenrod}" 
$a = $a + "</style>" 




$csv = Import-Csv $output | Select "File Name",DeviceName,"File Path" | ConvertTo-Html -head $a -Body "<H2>Cylance Weekly Report</H2>" 
#Imports the CSV saved to $output. 
#Selects File Name, Device Name, and File Path columns, then converts to HTML using the Head +Body Information 
$emailBody = "$csv" 

#defines the body text of the email. Note that this has to be a string, $emailBody = $csv will not work on its own. 

Send-MailMessage -From $emailFrom -To $emailRecipients -SmtpServer $emailSMTPServer -subject $emailSubject -Body $emailBody -BodyAsHtml 
#Sends the actual email 
関連する問題