代码块阻止脚本 运行,但以交互方式运行
Block of code prevents script from running, but runs interactively
我有一个 运行 作为计划任务的脚本,它在定义 $As 的行上出现意外标记错误而失败。如果我删除代码,脚本 运行s 正确。如果我将整个脚本(包括有问题的部分)粘贴到 PowerShell window 中,一切都会如预期的那样 运行。
我假设这是一个我从未遇到过的简单问题,但我无法弄清楚问题出在哪里,希望有经验的人能多多指教。
这是 运行 服务器 2012R2 上的 PS 5.0.117,但也发生在版本 4 下。
# Sanitize $UserLogon
$Garbage = "[?\' ]",''
$As = '[?ÀÁÂÃÄÅÆàáâãäåæ]','a'
$Cs = '[?Çç]','c'
$Es = '[?ÈÉÊËèéêë]','e'
$Is = '[?ÌÍÎÏìíîï]','i'
$Ns = '[?Ññ]','n'
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
$Ss = '[?ß]','s'
$Us = '[?ÙÚÛÜùúûü]','u'
$Thorns = '[?Þþ]','th'
$TextReplacers = $Garbage, $As, $Cs, $Es, $Is, $Ns, $Os, $Ss, $Us, $Thorns
foreach ($Replacement in $TextReplacers) {
$UserLogon = $UserLogon -replace $Replacement
}
我收到的确切错误是:
At C:\Scripts\Onboarding\CreateUserAccount0.ps1:121 char:17
+ $As = '[?ÀÃÂÃÄÅÆà áâãäåæ]','a'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'ÃÄÅÆà áâãäåæ]','a'
$Cs = '[?Çç]','c'
$Es = '[?ÈÉÊËèéêë]','e'
$Is = '[?ÃŒÃÃŽÃìÃîï]','i'
$Ns = '[?Ññ]','n'
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
$Ss = '[?ß]','s'
$Us = '[?ÙÚÛÜùúûü]','u'
$Thorns = '[?Þþ]','th'
$TextReplacers = $Garbage, $As, $Cs, $Es, $Is, $Ns, $Os, $Ss, $Us, $Thorns
foreach ($Replacement in $TextReplacers) {
$UserLogon = $UserLogon -replace $Replacement
}
# Check if AD user already exists.
$UserExists = Get-ADUser -Filter {SamAccountName -eq $UserLogon}
if ($UserExists -ne $Null){
$email = new-object Net.Mail.SMTPClient($mailServer)
$err += "$UserLogon' in expression or statement.
如果我注释掉 $As,$Ns 和 $Os 就会出现这种情况。如果我注释掉 $As、$Ns 和 $Os,它 运行 没问题。
PowerShell 可以从脚本文件 BOM 中检测到以下编码:UTF-8、UTF-16(LE 和 BE)和 UTF-32(LE 和 BE)。如果 BOM 不存在,则 PowerShell 使用 Encoding.Default
作为脚本文件。因此,您的 UTF-8 脚本文件应包含 BOM,以便识别 UTF-8。
在您的情况下,由于 PowerShell 解释以下所有字符而发生错误:'‘’‚‛
— 作为单引号字符。因此,当使用不正确的编码读取脚本文件时,字符串文字的某些部分会获得特殊含义并导致语法冲突。
$As = '[?ÀÃÂÃÄÅÆà áâãäåæ]','a'
^
$Ns = '[?Ññ]','n'
^
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
^
我有一个 运行 作为计划任务的脚本,它在定义 $As 的行上出现意外标记错误而失败。如果我删除代码,脚本 运行s 正确。如果我将整个脚本(包括有问题的部分)粘贴到 PowerShell window 中,一切都会如预期的那样 运行。
我假设这是一个我从未遇到过的简单问题,但我无法弄清楚问题出在哪里,希望有经验的人能多多指教。
这是 运行 服务器 2012R2 上的 PS 5.0.117,但也发生在版本 4 下。
# Sanitize $UserLogon
$Garbage = "[?\' ]",''
$As = '[?ÀÁÂÃÄÅÆàáâãäåæ]','a'
$Cs = '[?Çç]','c'
$Es = '[?ÈÉÊËèéêë]','e'
$Is = '[?ÌÍÎÏìíîï]','i'
$Ns = '[?Ññ]','n'
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
$Ss = '[?ß]','s'
$Us = '[?ÙÚÛÜùúûü]','u'
$Thorns = '[?Þþ]','th'
$TextReplacers = $Garbage, $As, $Cs, $Es, $Is, $Ns, $Os, $Ss, $Us, $Thorns
foreach ($Replacement in $TextReplacers) {
$UserLogon = $UserLogon -replace $Replacement
}
我收到的确切错误是:
At C:\Scripts\Onboarding\CreateUserAccount0.ps1:121 char:17
+ $As = '[?ÀÃÂÃÄÅÆà áâãäåæ]','a'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'ÃÄÅÆà áâãäåæ]','a'
$Cs = '[?Çç]','c'
$Es = '[?ÈÉÊËèéêë]','e'
$Is = '[?ÃŒÃÃŽÃìÃîï]','i'
$Ns = '[?Ññ]','n'
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
$Ss = '[?ß]','s'
$Us = '[?ÙÚÛÜùúûü]','u'
$Thorns = '[?Þþ]','th'
$TextReplacers = $Garbage, $As, $Cs, $Es, $Is, $Ns, $Os, $Ss, $Us, $Thorns
foreach ($Replacement in $TextReplacers) {
$UserLogon = $UserLogon -replace $Replacement
}
# Check if AD user already exists.
$UserExists = Get-ADUser -Filter {SamAccountName -eq $UserLogon}
if ($UserExists -ne $Null){
$email = new-object Net.Mail.SMTPClient($mailServer)
$err += "$UserLogon' in expression or statement.
如果我注释掉 $As,$Ns 和 $Os 就会出现这种情况。如果我注释掉 $As、$Ns 和 $Os,它 运行 没问题。
PowerShell 可以从脚本文件 BOM 中检测到以下编码:UTF-8、UTF-16(LE 和 BE)和 UTF-32(LE 和 BE)。如果 BOM 不存在,则 PowerShell 使用 Encoding.Default
作为脚本文件。因此,您的 UTF-8 脚本文件应包含 BOM,以便识别 UTF-8。
在您的情况下,由于 PowerShell 解释以下所有字符而发生错误:'‘’‚‛
— 作为单引号字符。因此,当使用不正确的编码读取脚本文件时,字符串文字的某些部分会获得特殊含义并导致语法冲突。
$As = '[?ÀÃÂÃÄÅÆà áâãäåæ]','a'
^
$Ns = '[?Ññ]','n'
^
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
^