2010-11-30 11 views
4

Je suis bloqué à la fin d'un script sur lequel un fichier est envoyé avant d'être supprimé. Sauf que ... le fichier semble toujours être ouvert, probablement par le client SMTP, donc j'obtiens une erreur quand j'essaye de le supprimer. Bien sûr, redémarrer un shell me permettra de le supprimer, ce n'est pas le point. ;-) Point est que je voudrais le créer, l'envoyer par courriel, le supprimer, dans un script.PowerShell Fermer le fichier/Supprimer le fichier après l'envoi par courrier électronique via .NET

L'erreur:

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. 

code:

$emailFrom = '[email protected]' 
$emailTo = '[email protected]' 
$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} 

Les lignes commentées sont mes tentatives d'injection des pauses et le nettoyage des ordures, ce qui a produit le même résultat.

Répondre

10

Dispose la pièce jointe et objets email

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

faire un GC ne sera pas utile, comme vous avez toujours refs racine

+0

IMPRESSIONNANT! Je vous remercie! –

0

navires de Powershell le Send-MailMessage Cmdlet qui dispose des références automatiquement.

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>] 

Dans votre cas, ce serait quelque chose comme:

$emailFrom = '[email protected]' 
$emailTo = '[email protected]' 
$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} 

Voir technet pour plus de détails.