Powershell ps1文件失败但代码很好

时间:2017-11-12 03:10:28

标签: powershell

当我从命令行运行我的Powershell脚本时,它会失败,但是如果我逐行复制并在Powershell控制台中运行它运行正常。

powershell -ExecutionPolicy Bypass -File "F:\email.ps1" -FFFeatureOff

的产率:

  

在F:\ email.ps1:16 char:126   + ... ential(“用户名”,“密码”);   + ~~~字符串缺少终结符:“。

     

在F:\ email.ps1:9 char:1   + {   +〜在语句块或类型定义中缺少关闭'}'。

如果我打开PowerShell窗口并粘贴脚本,它真的很奇怪,它可以工作,但是运行ps1文件我得到了错误,即使在编辑器中我也遇到了同样的问题

完整脚本:

$EmailTo = "xxxxx"
$EmailFrom = "xxxxxx"
$Subject = "LicenceKey & Instructions"
$Body = "This is an automated email"
$SMTPServer = "smtp.gmail.com"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$files=Get-ChildItem "C:\Users\alber\Desktop\LicenceKey\newuser"
Foreach($file in $files)
{
    Write-Host “Attaching File :- ” $file
    $attachment = New-Object System.Net.Mail.Attachment –ArgumentList "C:\Users\alber\Desktop\LicenceKey\newuser\$file"
    $SMTPMessage.Attachments.Add($attachment)
}
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password");
$SMTPClient.Send($SMTPMessage)

2 个答案:

答案 0 :(得分:2)

OP 接受 James C.'s answer这一事实表明OP的动机是OP对通常有用但非特定的 - 最终可能令人困惑的 - 指针的感激之情。它

不幸的是,作为对未来读者的一般兴趣的答案不足以及可能导致混淆 ;在撰写本文时:

  • 它包含一个非常不正确的声明:
  

这里的问题是$ file在消息的参数之外,移动引号将修复:Write-Host “Attaching File :- $file”

但是,Write-Host “Attaching File :- ” $file存在 no 问题,因为Write-Host只是将多个参数与空格连接起来 - 不需要严格需要单个参数。登记/> (如上所述,PowerShell识别“智能引号”(非ASCII引号),假设它们已正确编码 - 见下文。)

  • 解释OP发布的症状。

  • 它几乎让人觉得好像无法将文字" - 或$嵌入到双引号字符串中,因为PowerShell,当然不是真的;只需要用反引号转义即可:"Pa`$`$`"w0rd"

相反,PetSerAl问题的有用评论大概是指向实际答案:

  • 可能存在字符编码问题,因为使用了“智能引号”(非ASCII引号字符),这些字符会错误地显示编码脚本文件

  • PetSerAl answer here建议必须将UTF-8编码的脚本内容保存到带有BOM 的文件中,以便PowerShell识别编码。

  • 更新:PetSerAl推测“实际的麻烦制造者是EN DASH:
    –ArgumentList,如果解码不当:[Text.Encoding]::GetEncoding(1250).GetString([Text.Encoding]‌​::UTF8.GetBytes('–')‌​),则会产生–,不成对的双引号。“

答案 1 :(得分:1)

  

在F:\ email.ps1:9 char:1 + {+〜Missing closing'}'在语句块或类型定义中。

这里的问题是$file超出了邮件的参数,移动引用将解决这个问题:

Write-Host “Attaching File :- $file”

(智能引号“ ”已被PowerShell接受,但不是大多数其他语言,我个人对此无法确定。)

  

在F:\ email.ps1:16 char:126 + ... ential("用户名","密码"); + ~~~字符串缺少终结符:"。

您在此处使用的双引号:("username", "password")可能导致Powershell错误地解释密码在何处包含某些特殊字符时的结束位置。

例如,密码Pa$$"w0rd会因脚本中的双引号而在脚本中使用时出现问题。

它将被解释为"Pa$$"剩余的w0rd"(仅包含单个引号并且未正确终止为字符串)

为了避免这种情况,您可以使用单引号,它们不会被评估并被解释为文字:

$SMTPClient.Credentials = New-Object System.Net.NetworkCredential('username', 'password')

有关单引号和双引号的详细信息,请参阅about_quoting_rules