PowerShell Закрыть файл / Удалить файл после отправки по электронной почте через .NET - PullRequest
5 голосов
/ 01 декабря 2010

Я застрял в конце скрипта, над которым я работаю, где файл отправляется по электронной почте перед удалением. За исключением того, что ... файл, похоже, все еще открыт, вероятно, SMTP-клиентом, поэтому я получаю сообщение об ошибке при попытке удалить его. Конечно, перезапуск оболочки позволит мне удалить ее, это не главное. ;-) Суть в том, что я хотел бы создать его, отправить по электронной почте, удалить в одном сценарии.

Ошибка:

   Cannot remove item C:\Temp\myfile.csv: The process cannot access the file
    'C:\Temp\myfile.csv' because it is being used by another process.

Код:

$emailFrom = 'noreply@localhost'
$emailTo = 'aaron@localhost'
$smtpServer = 'localhost'

$FileName='myfile.csv'
$FilePathName='c:temp\' + $FileName

$subject = 'Emailing: ' + $FileName
$body = 'This message as been sent with the following file or link attachments: ' + $FileName

$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($FilePathName)
$smtp = new-object Net.Mail.SmtpClient($smtpServer)

$msg.From = $emailFrom
$msg.To.Add($emailTo)
$msg.Subject = $subject
$msg.Body = $body
$msg.Attachments.Add($att)
$smtp.Send($msg)

#Garbage Collection (used for releasing file for deleting)
# Start-Sleep -s 1
# [GC]::Collect()

#Clean-up/Remove File
# Start-Sleep -s 1
if (Test-Path $FilePathName) {Remove-Item $FilePathName}

Закомментированные строки - мои попытки ввести паузы и очистку от мусора, которые дали тот же результат.

Ответы [ 2 ]

11 голосов
/ 01 декабря 2010

Удалите вложения и объекты электронной почты

$att.Dispose();
$msg.Dispose();

выполнение GC не поможет, так как у вас все еще есть корневые ссылки

0 голосов
/ 17 февраля 2012

Powershell v2 поставляет командлет Send-MailMessage, который автоматически удаляет ссылки.

SYNTAX
    Send-MailMessage [-To] <string[]> [-Subject] <string> -From <string> 
    [[-Body] <string>] [[-SmtpServer] <string>] [-Attachments <string[]>]
    [-Bcc <string[]>] [-BodyAsHtml] [-Cc <string[]>] [-Credential <PSCredential>]
    [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}]
    [-Encoding <Encoding>] [-Priority {Normal | Low | High}]
    [-UseSsl] <CommonParameters>]

В вашем случае это будет что-то вроде:

$emailFrom = 'noreply@localhost'
$emailTo = 'aaron@localhost'
$smtpServer = 'localhost'

$FileName='myfile.csv'
$FilePathName= [System.Io.Path]::Combine('c:\temp\', $FileName)

$subject = 'Emailing: ' + $FileName
$body = 'This message as been sent with the following file or link attachments: ' + $FileName

Send-MailMessage -To $emailTo -From $emailFrom -Subject $subject -Body $body -Attachments $filePathName -SmtpServer $smtpserver -Encoding ([System.Text.Encoding]::UTF8)

#Clean-up/Remove File
if (Test-Path $FilePathName) {Remove-Item $FilePathName}

См. technet для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...