PowerShell脚本发送带附件邮件后文件仍被锁定如何解决?
原因
System.Net.Mail.MailMessage和System.Net.Mail.Attachment均实现了IDisposable接口,加载附件后会持有对应文件的句柄,未主动调用释放方法时,句柄只会在垃圾回收器自动回收对象或PowerShell进程退出时才会释放,就会出现文件被持续占用的情况。
解决方案
方法1:手动调用释放方法
邮件发送完成后主动调用对象的Dispose()方法即可立即释放持有的文件句柄:
$message = New-Object System.Net.Mail.MailMessage $sender, $mailTo $message.Subject = "Test email with attachment" $message.Body = "See attachment." $message.Attachments.Add("path\to\file") $smtpClient = New-Object Net.Mail.SmtpClient($smtpHostname, $smtpPort) $smtpClient.EnableSSL = $true $smtpClient.send($message) # 新增释放逻辑,执行后文件锁立即解除 $message.Dispose() $smtpClient.Dispose()
方法2:使用using语句自动释放(推荐,支持PowerShell 5.1及以上版本)
using语句会在代码块执行结束后自动释放实现了IDisposable接口的对象,无需手动写释放逻辑,避免遗漏:
using ($message = New-Object System.Net.Mail.MailMessage $sender, $mailTo) using ($smtpClient = New-Object Net.Mail.SmtpClient($smtpHostname, $smtpPort)) { $message.Subject = "Test email with attachment" $message.Body = "See attachment." $message.Attachments.Add("path\to\file") $smtpClient.EnableSSL = $true $smtpClient.send($message) } # 执行到此处时所有关联资源已自动释放
补充说明
如果需要提前释放单个附件,可直接遍历$message.Attachments集合,对指定附件对象调用Dispose()方法即可。
内容的提问来源于stack exchange,提问作者ytingyeu
相关产品推荐
相关产品推荐

