【问题标题】:Powershell script not executing past for loopPowershell脚本没有执行过去的for循环
【发布时间】:2019-05-17 12:04:49
【问题描述】:

我已经取得了一些进展,并坚持使用附件。下面的脚本现在发送一封电子邮件,但没有附件

$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”个参数调用“添加”的异常:“值不能为空。 参数名称:item" 在 C:\GentranScripts\APERAK_REPORT_EMAIL1.ps1:22 char:21 + $MSG.attachments.add

【问题讨论】:

  • for some reason, the script is entering into the for loop. ... 那么这里有什么问题呢?
  • 你的意思是没有进入?还是正在输入但不发送电子邮件?请详细点?
  • 不知道是什么问题,光标没有进入for循环。
  • 您确定“C:\Reports\APERAK”是您服务器上的正确路径吗?尝试自己输出$files.Count,看看输出。
  • 为什么不用foreach?正如我所看到的,除了数组元素的寻址之外,您不会将 $i 用于任何事情。

标签: powershell loops for-loop each


【解决方案1】:

问题是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")

【讨论】:

  • @chandanT Get-ChildItem "C:\Reports\APERAK" 也可以返回 DirectoryInfo 对象。这些是子文件夹。在您的循环中,您希望所有内容都是一个文件,您可以在其上执行Get-Content。为确保您只获得 FileInfo 对象,请使用 Get-ChildItem "C:\Reports\APERAK" -File 或使用 Get-ChildItem "C:\Reports\APERAK" | Where-Object { -not $_.PSIsContainer }(如果您使用的是旧 PowerShell 版本)
  • 请注意,标量(单个)返回对象仅在 PowerShell v2 中存在问题。在 v3+ 中,即使是单个对象也有 .Count 属性(例如,尝试 'foo'.Count
  • 我已经取得了一些进展,并坚持使用附件。
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2019-10-11
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多