Вам необходимо встроить тест, чтобы увидеть, заблокирован ли файл (все еще записывается) или нет. Для этого вы можете использовать эту функцию:
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
}
Надеюсь, что это поможет