Powershell ps1文件失败,但代码正常
当我从命令行运行Powershell脚本时,它会失败,但是如果我逐行复制并在Powershell控制台中运行它,它会正常运行Powershell ps1文件失败,但代码正常,powershell,Powershell,当我从命令行运行Powershell脚本时,它会失败,但是如果我逐行复制并在Powershell控制台中运行它,它会正常运行 powershell -ExecutionPolicy Bypass -File "F:\email.ps1" -FFFeatureOff 收益率: 在F:\email.ps1:16 char:126 + ... 统一的(“用户名”、“密码”); +~~~字符串缺少终止符:“ 在F:\email.ps1:9 char:1 + { +~语句块或类型定义中缺少结尾“}” 如
powershell -ExecutionPolicy Bypass -File "F:\email.ps1" -FFFeatureOff
收益率:
在F:\email.ps1:16 char:126
+ ... 统一的(“用户名”、“密码”);
+~~~字符串缺少终止符:“
在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)
在F:\email.ps1:9 char:1+{+~语句块或类型定义中缺少结尾'}'
这里的问题是,$file
超出了消息的参数范围,移动引号将解决以下问题:
Write-Host “Attaching File :- $file”
(PowerShell接受智能引号“
”,但不是大多数其他语言,我个人避免使用它们。)
在F:\email.ps1:16 char:126+…ential(“用户名”、“密码”);+~~~字符串缺少终止符:“ 此处使用的双引号:
(“用户名”、“密码”)
可能会导致Powershell错误地解释密码的结束位置(如果密码包含某些特殊字符)
例如,密码Pa$$”w0rd
在脚本中使用时会导致问题,因为其中有双引号
它将被解释为“Pa$$”
,剩余的w0rd“
剩余(仅包含一个引号,未正确终止为字符串)
为了避免这种情况,您可以改为使用单引号,它们不会被计算并被解释为文字:
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential('username', 'password')
有关单引号和双引号的详细信息,请参见关于
在F:\email.ps1:9 char:1+{+~语句块或类型定义中缺少结尾'}'
这里的问题是,$file
超出了消息的参数范围,移动引号将解决以下问题:
Write-Host “Attaching File :- $file”
(PowerShell接受智能引号“
”,但不是大多数其他语言,我个人避免使用它们。)
在F:\email.ps1:16字符:126+。。。统一的(“用户名”、“密码”);+~~字符串缺少终止符:“ 此处使用的双引号:
(“用户名”、“密码”)
可能会导致Powershell错误地解释密码的结束位置(如果密码包含某些特殊字符)
例如,密码Pa$$”w0rd
在脚本中使用时会导致问题,因为其中有双引号
它将被解释为“Pa$$”
,剩余的w0rd“
剩余(仅包含一个引号,未正确终止为字符串)
为了避免这种情况,您可以改为使用单引号,它们不会被计算并被解释为文字:
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential('username', 'password')
有关单引号和双引号的更多信息,请参见about。OP接受了,这一事实表明,其动机是OP感谢其中所包含的通常有用但非具体且最终可能令人困惑的指针
不幸的是,它没有成为未来读者普遍感兴趣的答案,并且可能会引起混淆。;在撰写本文时:
- 它包含一个明显不正确的声明:
Write Host“Attaching file:-$file”
但是,Write-Host”附加文件:-“$File
”没有问题,因为Write-Host只是将多个参数用空格连接起来,不需要一个参数。(如上所述,PowerShell识别“智能引号”(非ASCII引号),假设它们经过正确编码-见下文)
- 它并没有解释张贴的OP的症状
- 由于PowerShell中的限制,它几乎让人觉得不可能在双引号字符串中嵌入文本
”,或者“
,当然,这不是真的;只需要使用反勾号进行转义:$
“Pa`$`$`“w0rd”
相反,他对这个问题的有益评论大概指向了实际答案:
- 如果使用了“智能引号”(非ASCII引号字符),可能会出现字符编码问题,这将出现在编码错误的脚本文件中
- PetSerAl建议,UTF-8编码的脚本内容必须保存到带有BOM的文件中,以便PowerShell识别编码
- 更新:PetSerAl推测“真正的麻烦制造者在这里是个破折号:
,当解码不正确时:–ArgumentList
[Text.Encoding]::GetEncoding(1250).GetString([Text.Encoding]::UTF8.GetBytes(“–”))代码>,产生
,一个不成对的双引号。”–欧元“
- 它包含一个明显不正确的声明:
Write Host“Attaching file:-$file”
但是,Write-Host”附加文件:-“$File
”没有问题,因为Write-Host只是将多个参数用空格连接起来,不需要严格的单个参数