Вложение электронной почты PowerShell: не удалось найти файл ‘D:20201124131044TRACS-20201124034849error.log environment.log RACS-20201124034849.sterr.стандартный вывод

#powershell #powershell-3.0

#powershell #powershell-3.0

Вопрос:

Я пытаюсь отправить электронное письмо только с теми вложениями, которые существуют в каталоге. Есть три набора файлов, которые я отслеживаю: error.log, environment.log и стандартный вывод. Я хочу проверить, существует ли каждый из файлов, и если да, то добавить его в список и отправить в виде вложений. Я не хочу ничего делать, если файлы не существуют. Я попытался просмотреть список файлов (это в Windows), а затем, если файлы существуют, отправить их. Мой код ниже:

 $PSEmailServer = "xxxxxxxxxxx"
$Password ="xxxxxxxxx"
$mypassword = ConvertTo-SecureString $Password -AsPlainText -Force
$mycredential = New-Object System.Management.Automation.PSCredential ("xxxxx", $mypassword)
$EmailSubject ="test"
$filepath ="D:20201124131044TRACS-20201124034849"
$files = @('error.log','environment.log','TRACS-20201124034849.sterr.stdout')
$FromEmail ="xxxxxxxxxx"     


if(($files | foreach{Test-path $filepath }) -contains $True){

$newfile = $filepath    $files
Send-MailMessage -From $FromEmail -To "xxxxxxx" -Subject $EmailSubject -Body "test" -Credential $mycredential -Attachments $newfile
}
 else {
  echo "nothing"
  exit
 }
 

когда я выполняю описанное выше, я получаю следующую ошибку:

 Send-MailMessage : Could not find file 'D:20201124131044TRACS-20201124034849error.log environment.log TRACS-20201124034849.sterr.stdout'. At C:UsersDownloadspowershell.ps1:22 char:1
  Send-MailMessage -From $FromEmail -To "xxxxxxx" -Subje ...
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : NotSpecified: (:) [Send-MailMessage], FileNotFoundException
      FullyQualifiedErrorId : > System.IO.FileNotFoundException,Microsoft.PowerShell.Commands.SendMailMessage
 

Я думаю, мне нужно повторить список, чтобы прикрепить каждое имя файла к его пути к файлу, а затем сохранить его в списке, а затем отправить электронное письмо? Пожалуйста, посоветуйте.

Ответ №1:

Вы можете просто использовать -contains или -in для поиска имен файлов в массиве. Кроме того, я бы рекомендовал использовать splatting для параметров отправки-MailMessage:

 $filepath = "D:20201124131044TRACS-20201124034849"
$files    = 'error.log','environment.log','TRACS-20201124034849.sterr.stdout'

# find files with names that can be found in the $files array
$attachments = @(Get-ChildItem -Path $filepath -File | Where-Object { $files -contains $_.Name })

# if we have any files to send
if ($attachments.Count) {
    $Password     = "xxxxxxxxx"
    $mypassword   = ConvertTo-SecureString $Password -AsPlainText -Force
    $mycredential = New-Object System.Management.Automation.PSCredential ("xxxxx", $mypassword)
    # use splatting for better readability
    $mailParams = @{
        To          = "xxxxxxx"
        From        = "xxxxxxxxxx"
        Subject     = "test"
        Body        = "test"
        Credential  = $mycredential
        Attachments = $attachments.FullName
        SmtpServer  = "xxxxxxxxxxx"
        # more parameters can be added here
    }
    # send the email
    Send-MailMessage @mailParams
}
else {
    Write-Host 'Nothing to send..'
}
 

Ответ №2:

Попробуйте

 $PSEmailServer = "xxxxxxxxxxx"
$Password ="xxxxxxxxx"
$mypassword = ConvertTo-SecureString $Password -AsPlainText -Force
$mycredential = New-Object System.Management.Automation.PSCredential ("xxxxx", $mypassword)
$EmailSubject ="test"
$attachments = Get-ChildItem "D:20201124131044TRACS-20201124034849" | Where-Object {$_.Name -match "error.log|environment.log|TRACS-20201124034849.sterr.stdout"}
$FromEmail ="xxxxxxxxxx"     


if($attachments){      
Send-MailMessage -From $FromEmail -To "xxxxxxx" -Subject $EmailSubject -Body "test" -Credential $mycredential -Attachments $attachements
}
 else {
  echo "nothing"
  exit
 }         
 

Комментарии:

1. -match использует регулярное выражение, поэтому вам нужно экранировать специальные символы в именах файлов (точка) обратной косой чертой

2. Вы правы, я думаю, что PowerShell справляется с этим, я попробовал на своем компьютере, и это сработало без экранирования символов!

3. Нет, PowerShell не обрабатывает это . В регулярном выражении точка означает «любой отдельный символ», поэтому ваше совпадение также будет передавать ‘errorXlog’. Поскольку вы также не привязываете параметры, сумасшедшее имя файла, такое как ‘blah123errorQlog789.xyz’, пропустит совпадение