2017-03-15 8 views
-1

最近電子メール自動化のためのPSスクリプトの作業を開始しました。 PowerShellがデータを抽出している場所(複数の受信者、添付ファイルなど)からCSVファイルを取得した場所に、何かをまとめて管理します。 問題は、いくつかのセルが空の場合、スクリプトはうまくいきません。 あり1 similar questionですが、私はちょうど私の場合にソリューションを実装する方法を確認していない:csv/empty cell issueからのPowerShell複数の電子メール受信者(添付)

$importFile  = "Users.csv" 

$users = import-csv $importFile | select * 
foreach($user in $users) 
{ 
    $Name   = $user.'Name' 
    $to    = $user.'To' 
    $to2  = $user.'To2' 
    $Attachment = $user.'Attachment' 
    $Attachment2 = $user.'Attachment2'  

    $write = "Emailing account " + $to + " ..." 
    Write-Host $write 

    $body = [string]::join([environment]::newline, (Get-Content -path $emailFile)) 

    $body = $body.Replace('[Name]', $Name) 

    $mail = New-Object System.Net.Mail.MailMessage 
    $mail.From = $emailFrom 
    $mail.To.Add($to) 
    $mail.To.Add($to2) 
    $mail.Subject = $emailSubject 
    $mail.IsBodyHtml = $true 
    $mail.Body = $body 
    $mail.Attachments.Add($Attachment) 
    $mail.Attachments.Add($Attachment2)  

    $smtp = New-Object System.Net.Mail.SmtpClient 
    $smtp.Host = $smtpServerHost 
    $smtp.Port = $smtpServerPort 
    $smtp.EnableSsl = $smtpServerSsl 
    $smtp.UseDefaultCredentials = $false 
    $smtp.Credentials = $credentials 
    $smtp.Send($mail) 

This is how looks CSV file

任意の提案は大歓迎:)

+1

"*私がこのコードを書いたのは、私がこのコードを書いたもので、うまくいきません。 (コードダンプ) "* - https://ericlippert.com/2014/03/05/how-to-debug-small-programs/。どのようにして「うまくいきませんか」、あなたのスクリプトのどのビットがそれをしますか – TessellatingHeckler

+0

System.Net.Mail.MailMessageの使用を避ける:PowershellにはネイティブコマンドSend-Mailmessageがあります(これはコードを10〜15行に減らす必要があります)。 "スクリプトはうまくいかない"とあなたの入力ファイルで空であるセルを説明していますか? – bluuf

+0

@TessellatingHecklerと@bluuf、入力ありがとうございます。私は問題のより良い理解のためにCSVファイルを追加しました 私は ' – LordWood

答えて

0

ことへのショートカットができます:それは価値がある何のため

$users = Import-Csv $importFile | 
Where-Object {$_.Name -ne ""} | 
Select-Object * 

。例えば、($to2 -ne '')$ to2セルが空であるかどうかをチェックしている場合。いいえの場合は、$mail.To.Add($to2)です。 $ Attachmentの場合と同じ状況です。

$mail = New-Object System.Net.Mail.MailMessage 
$mail.From = $emailFrom 
$mail.To.Add($to) 
    if ($to2 -ne '') { 
     $mail.To.Add($to2) 
     } 
$mail.Subject = $emailSubject 
$mail.IsBodyHtml = $true 
$mail.Body = $body 
$mail.Attachments.Add($Attachment) 
    if ($Attachment2 -ne '') { 
     $mail.Attachments.Add($Attachment2) 
     } 
+0

なぜこれで問題が解決したのか説明できますか? –

+0

たとえば、 '$($ to2 -ne '')'が_ $ to2_ cellが空であるかどうかをチェックしています。そうでなければ '$ mail.To.Add($ to2)';セルが空の場合は、単にスキップします。 _ $ Attachment_と同じ状況 – LordWood

+0

これは素晴らしいことです。今後の人々がより簡単に見つけることができるように、回答を更新してください。 :) –

1

行をフィルタリングするWhere-Objectを試してみてください以上です。全体の「行」が空白である場合は、これは単に機能がケースを解決した場合を実装

... 
Where-Object {$_} | 
... 
+0

'Where-Object'を設定することができました。 – LordWood

+0

' $ users = Import-Csv $ importFile | Where-Object {$ _。Name -ne " " - and $ _。To -ne" "と$ _。添付ファイル-ne" "と$ _。Att achment2 -ne ""} | Select-Object * ' - 最初のメールを連続して送信するためにスキップします – LordWood

+0

' $ users = Import-Csv $ importFile | Where-Object {$ _。Name -ne "" - または$ _。To -ne ""または$ _。Attachment -ne ""または$ _。Attachment2 -ne ""} | Select-Object * ' - エラーを返します: – LordWood

関連する問題