当我从命令行运行我的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)
答案 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。