none
Как удалить архив, созданный с помощью Compress-Archive? RRS feed

  • Вопрос

  • В скрипте командой Compress-Archive создаётся временный архив, который отправляется по почте.
    После отправки архив не нужен и его надо удалить. Но при удалении выдаётся следующая ошибка (см. ниже). Файл архива залочен Powershell, и пока оболочку не закроешь - файл не удаляется. Можно ли это как-то решить внутри одного скрипта?

    Remove-Item : Cannot remove item D:\TEMP\send.zip: Access to the path is denied.
    At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:183 char:13
    +             Remove-Item -Path $DestinationPath -Force -ErrorAction St ...
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (D:\TEMP\send.zip:FileInfo) [Remove-Item], ArgumentException
        + FullyQualifiedErrorId : RemoveFileSystemItemArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand

    2 апреля 2019 г. 6:43

Ответы

  • Попробуйте вместо зануления переменных использовать метод dispose() у обьекта $msg

    $msg.Dispose()

    У меня на в тестах вроде работает

    Вторая альтернатива это использование Send-MailMessage вместо кастомного обьекта, так как у упомянутого командлета не должно быть проблем с промежуточными состояниями и по завершению отработки команды он должен освобождать все с чем работал.


    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 2 апреля 2019 г. 20:32
    • Помечено в качестве ответа Cross13 3 апреля 2019 г. 12:29
    2 апреля 2019 г. 20:29
    Модератор

Все ответы

  • покажите скрипт целиком

    скорее всего у вас в предыдущем этапе какая-то команда не завершается на момент удаления файла


    The opinion expressed by me is not an official position of Microsoft

    2 апреля 2019 г. 6:56
    Модератор
  • Вот сам скрипт:

    # -------------------------------------
    # Отправить файлы о работе Консультант+
    # -------------------------------------
    $EmailFrom = "admin@mycompany.ru"
    $EmailTo = "user@inet.ru"
    
    $CurrentDate = Get-Date
    $t = "Файлы из Консультант+" + " от " + $CurrentDate
    
    $zipname = "D:\TEMP\cons_STS" + "_" + $CurrentDate.Year + "-" + $CurrentDate.Month + "-" + $CurrentDate.Day + ".zip"
    Compress-Archive -Path Y:\konsultant\ADM\STS\* -DestinationPath $zipname -Force
    
    $msg = New-Object Net.Mail.MailMessage
    $msg.Attachments.Add("Y:\konsultant\Receive\CONS#107_760591.USR")
    $msg.Attachments.Add("Y:\konsultant\Receive\LAST_REC.TXT")
    $msg.Attachments.Add($zipname)
    $msg.Body = $t
    $msg.Subject = $t
    $msg.From = $EmailFrom
    $msg.To.Add($EmailTo)
    
    $SMTPServer = "mail.mycompany.loc"
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
    
    $SMTPClient.EnableSsl = $True
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("mycompany\test1", "Qaz123456");
    
    $SMTPClient.Send($msg)
    
    Remove-Item -Path $DestinationPath -Force

    2 апреля 2019 г. 7:15
  • перед удалением файла занулите $msg и $smptclient

    The opinion expressed by me is not an official position of Microsoft

    2 апреля 2019 г. 7:17
    Модератор
  • Добавил перед удалением три строки:

    $msg = $null
    $SMTPClient = $null
    $SMTPServer = $null

    Всё равно ошибка:

    PS C:\Windows\system32> C:\SEND_MAIL\test.ps1
    Remove-Item : Cannot remove item D:\TEMP\cons_STS_2019-4-2.zip: The process cannot access the file 'D:\TEMP\cons_STS_2019-4-2.zip' because it is being used by another 
    process.
    At C:\SEND_MAIL\test.ps1:34 char:1
    + Remove-Item -Path $zipname -Force
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (D:\TEMP\cons_STS_2019-4-2.zip:FileInfo) [Remove-Item], IOException
        + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand

    Руками тоже не удаляется, пока PS не закроешь.
    • Изменено Cross13 2 апреля 2019 г. 7:46
    2 апреля 2019 г. 7:36
  • Попробуйте вместо зануления переменных использовать метод dispose() у обьекта $msg

    $msg.Dispose()

    У меня на в тестах вроде работает

    Вторая альтернатива это использование Send-MailMessage вместо кастомного обьекта, так как у упомянутого командлета не должно быть проблем с промежуточными состояниями и по завершению отработки команды он должен освобождать все с чем работал.


    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 2 апреля 2019 г. 20:32
    • Помечено в качестве ответа Cross13 3 апреля 2019 г. 12:29
    2 апреля 2019 г. 20:29
    Модератор
  • Dispose помог. Файл удалился без проблем!
    Спасибо!

    3 апреля 2019 г. 12:30