2016-05-13 2 views
4

У меня есть сценарий, который запускается как запланированная задача, которая не работает с неожиданной ошибкой токена в строке, где $ As определен. Если я удалю код, сценарий будет работать правильно. Если я вставляю весь скрипт (включая проблемный раздел) в окно PowerShell, все работает так, как ожидалось.Блок кода предотвращает запуск скрипта, но работает в интерактивном режиме

Я предполагаю, что это простая проблема, с которой я просто не сталкивался, но я не могу понять, в чем проблема с ней, более опытные глаза будут оценены.

Это выполняется на сервере 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, он работает нормально.

ответ

7

PowerShell может обнаруживать следующие кодировки из файла сценария. Спецификация: UTF-8, UTF-16 (LE и BE) и UTF-32 (LE и BE). Если BOM нет, то PowerShell использует файл Encoding.Default для файла сценария. Таким образом, ваш файл сценария UTF-8 должен включать в себя спецификацию для UTF-8.

В вашем случае ошибка происходит из-за того, что PowerShell интерпретирует все следующие символы: '‘’‚‛ - как символ одиночной кавычки. Итак, когда ваш файл сценария был прочитан с неправильной кодировкой, некоторые части того, что было строковыми литералами, получили особое значение и вызывают синтаксическое нарушение.

$As = '[?ÀÃÂÃÄÅÆà áâãäåæ]','a' 
      ^
$Ns = '[?Ññ]','n' 
     ^
$Os = '[?ÒÓÔÕÖØðòóôõöø]','o' 
     ^
+0

Спасибо. Повторное сохранение файла с помощью спецификации исправлено. Благодарим вас за подробные сведения о проблеме, а не только о проблеме. –