Невозможно отправить электронное письмо с вложениями с помощью сценария PowerShell. - PullRequest
0 голосов
/ 19 июня 2020

У меня есть сценарий, который запускает этот сценарий каждые 30 минут. Этот сценарий должен отправить электронное письмо, если файл находится в папке. У меня проблема в том, что я получаю сообщение об ошибке: «файл используется другим процессом ...», то есть «Send-MailMessage @Msg»

Как я могу это исправить?

$Email       = "myemail"
$Internal    = "cc"
$Subject     = "Form"

[array]$attachments = Get-ChildItem "\\ip\ftp$\c\1\files\Backorder" *.err

if ([array]$attachments -eq $null) {
}

else {

$Msg = @{
    to          = $Email
    cc          = $Internal
    from        = "address"
    Body        = "some text"

    subject     = "$Subject"
    smtpserver  = "server"
    BodyAsHtml  = $True
    Attachments = $attachments.fullname
}

Send-MailMessage @Msg

Start-Sleep -Seconds 1800

}

1 Ответ

1 голос
/ 19 июня 2020

Вам необходимо встроить тест, чтобы увидеть, заблокирован ли файл (все еще записывается) или нет. Для этого вы можете использовать эту функцию:

function Test-LockedFile {
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('FullName', 'FilePath')]
        [string]$Path
    )
    $file = [System.IO.FileInfo]::new($Path)
    # old PowerShell versions use:
    # $file = New-Object System.IO.FileInfo $Path

    try {
        $stream = $file.Open([System.IO.FileMode]::Open,
                             [System.IO.FileAccess]::ReadWrite,
                             [System.IO.FileShare]::None)
        if ($stream) { $stream.Close() }
        return $false
    }
    catch {
        return $true
    }
}

Имея это на месте, где-то над вашим текущим кодом, вы можете сделать:

$Email    = "myemail"
$Internal = "cc"
$Subject  = "Form"

# get the fullnames of the *.err files in an array
$attachments = @(Get-ChildItem -Path "\\ip\ftp$\c\1\files\Backorder" -Filter '*.err' -File)

if ($attachments.Count) {
    # wait while the file(s) are locked (still being written to)
    foreach ($file in $attachments) {
        while (Test-LockedFile -Path $file.FullName) {
            Start-Sleep -Seconds 1
        }
    }

    $Msg = @{
        To          = $Email
        Cc          = $Internal
        From        = "address"
        Body        = "some text"
        Subject     = $Subject
        SmtpServer  = "server"
        BodyAsHtml  = $True
        Attachments = $attachments.FullName
    }

    Send-MailMessage @Msg

    Start-Sleep -Seconds 1800
}

Надеюсь, что это поможет

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