Чтобы проверить и убедиться, что файл csv существует до того, как вы обработаете все это, вы можете использовать Test-Path,
...
if (!(Test-Path D:\FileSource.csv)) {
Write-Output "No File Found"
$SMTPBody += "There are no new files at the moment"
return; # Dont run. file not found. Exit out.
}
Import-Csv -Path "D:\FILESOURCE.csv" -ErrorAction Stop | foreach {
...
, и для получаемой вами ошибки Body она исходит из наконец, l oop, потому что есть случаи, когда $SMTPBody
будет нулевым. Это больше не будет проблемой, потому что $ SMTPBody будет иметь некоторый текст, когда файл не найден в начале.
Даже если вы используете return
в операторе if, чтобы проверить, существует ли файл, finally
всегда будет казнен. Поскольку мы обновили $ smtpbody, ваш Send-MailMessage
больше не будет выдавать ошибку.
Обновление
Если вы хотите проверить, существует ли загружаемый файл, вы можно использовать оператор if следующим образом:
foreach ($download in $synchronizationResult.Downloads ) {
if (!(Test-Path Join-Path D: $download.FileName) {
$SMTPBody += "File $($download.Filename) already exists, skipping."
continue # will go to the next download...
}
Write-Host "File $($download.FileName) downloaded" -ForegroundColor Green
...
Если вы все-таки получили ошибку, касающуюся тела, то это в основном потому, что ваш скрипт обнаружил исключение и был отправлен прямо в оператор finally
. Finally
оператор отправляет электронное письмо с пустым телом, потому что оно никогда не было установлено (из-за исключения). Я бы порекомендовал использовать отладчик (шаг через) и посмотреть, какой шаг вызывает исключение, и посмотреть, как добавить шаги, чтобы убедиться, что скрипт не дает сбоя.