Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell ps1文件失败,但代码正常_Powershell - Fatal编程技术网

Powershell ps1文件失败,但代码正常

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脚本时,它会失败,但是如果我逐行复制并在Powershell控制台中运行它,它会正常运行

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感谢其中所包含的通常有用但非具体且最终可能令人困惑的指针

不幸的是,它没有成为未来读者普遍感兴趣的答案,并且可能会引起混淆。;在撰写本文时:

  • 它包含一个明显不正确的声明:
这里的问题是$file在消息的参数之外,移动引号将修复:
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(“–”)‌​),产生
    –欧元“
    ,一个不成对的双引号。”

OP接受了,这一事实表明,OP之所以接受,是因为OP感谢其中所包含的普遍有用、但不具体、最终可能令人困惑的指针

不幸的是,它没有成为未来读者普遍感兴趣的答案,并且可能会引起混淆。;在撰写本文时:

  • 它包含一个明显不正确的声明:
这里的问题是$file在消息的参数之外,移动引号将修复:
Write Host“Attaching file:-$file”

但是,
Write-Host”附加文件:-“$File
”没有问题,因为Write-Host只是将多个参数用空格连接起来,不需要严格的单个参数