Скрипт Powershell не выполняет цикл for - PullRequest
0 голосов
/ 17 декабря 2018

Я добился определенного прогресса и застрял с приложением.Ниже скрипт теперь отправляет электронное письмо, но без вложения.

$sub = "APERAK/INVRPT Report "
$to="Chandan.Talasila@XXXXXXXX.com"
$folder = "C:\script\APERAK"
$files = Get-ChildItem "C:\script\APERAK"
$tstmp = Get-Date -UFormat "%H%M"
$dstamp = Get-Date -UFormat "%Y%m%d"
$from="Reports@XXXXXXXX.com"
$smtpserver = "mail.XXXXXXXX.com"
for ($i=0; $i -lt $files.Count; $i++) {

$subject=  $sub + $dstamp #+ " " +$tstmp
$filename =  $files[$i].FullName
$abpath = $folder + $files[$i].FullName

$attachment = new-object Net.Mail.Attachment($abpath)

$body= Get-Content $filename
$SMTP = new-object Net.Mail.SmtpClient($smtpserver)
$MSG = new-object Net.Mail.MailMessage($from, $to, $subject, $body)
$MSG.attachments.add($attachment)
$SMTP.send($msg)
}

Исключение вызывает "Добавить" с аргументом (ами) "1": "Значение не может быть нулевым. Имя параметра: элемент" В C: \ GentranScripts\ APERAK_REPORT_EMAIL1.ps1: 22 char: 21 + $ MSG.attachments.add <<<< ($ attachment) + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException </p>

1 Ответ

0 голосов
/ 17 декабря 2018

Проблема в том, что Get-Childitem вернет два типа объектов.Если есть только один файл, $files = Get-ChildItem "C:\Reports\APERAK" будет содержать FileInfo.Если есть больше, он будет содержать массив объектов FileInfo.Давайте рассмотрим пример:

md foo
cd foo
set-content -Path "foo.txt" -Value ""
$files = gci
$files.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     FileInfo                                 System.IO.FileSystemInfo

set-content -Path "foo2.txt" -Value ""
$files2 = gci
$files2.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Что касается решения, оберните gci в массив.Вот так

$files = @(Get-ChildItem "C:\Reports\APERAK")
...