Rob*_*ash 4 powershell powershell-4.0 powershell-5.0
我有一个作为计划任务运行的脚本,该脚本在定义$ As的行上发生意外令牌错误而失败.如果我删除代码,脚本运行正常.如果我将整个脚本(包括有问题的部分)粘贴到PowerShell窗口中,则所有内容都按预期运行.
我假设这是一个我刚刚没有遇到过的简单问题,但我无法弄清楚问题是什么,更有经验的眼睛会受到赞赏.
这是在Server 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
}
Run Code Online (Sandbox Code Playgroud)
我收到的确切错误是:
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.
Run Code Online (Sandbox Code Playgroud)
如果我注释掉$ As,它会发生$ Ns和$ Os.如果我注释掉$ As,$ Ns和$ Os,它运行正常.
PowerShell可以从脚本文件BOM中检测以下编码:UTF-8,UTF-16(LE和BE)和UTF-32(LE和BE).如果BOM不存在,则PowerShell Encoding.Default用于脚本文件.因此,您的UTF-8脚本文件应包含要识别的UTF-8的BOM.
在您的情况下,由于PowerShell解释所有后续字符而发生错误:'‘’‚?- 作为单引号字符.因此,当您使用不正确的编码读取脚本文件时,字符串文字的某些部分会获得特殊含义并导致语法违规.
$As = '[?ÀÃÂÃÄÅÆà áâãäåæ]','a'
^
$Ns = '[?Ññ]','n'
^
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o'
^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |