Ошибка сценария PowerShell «Неожиданный токен« h »в выражении или выражении. В строке отсутствует терминатор:» - PullRequest
0 голосов
/ 12 ноября 2018

В моем консольном приложении есть следующий код для получения информации о сервере с помощью PowerShell:

string PsCmd = "add-pssnapin VMware.VimAutomation.Core; $vCenterServer = '" + vCenterName.Trim() + "';$vCenterAdmin = '" + vCenterUsername.Trim() + "' ;$vCenterPassword = '" + vCenterPassword + "';" + System.Environment.NewLine;

PsCmd = PsCmd + "$VIServer = Connect-VIServer -Server $vCenterServer -User $vCenterAdmin -Password $vCenterPassword;" + System.Environment.NewLine;

PsCmd = PsCmd + "Get-VMHost " + System.Environment.NewLine;

Теперь скрипт работает хорошо на 150 серверах, которые у нас есть, но на одном сервере я получаю следующее исключение:

В строке: 1 символ: 131 + ...! ******* (******** 6 '*; *****'; + ~ Неожиданный токен 'h' в выражении или утверждении. В строке: 1 символ: 135+ ... ** (****** '; '; + ~~ В строке отсутствует терминатор: '. | ABC

Что вызывает ошибку в переменной пароля. И в моем случае я получаю пароль от внешнего API RESP. Теперь пароль имеет такой формат:

\"************

Где он начинается с 2 зарезервированных символов \", и объект JSON, который я получу, будет выглядеть следующим образом {"PASSWORD":"\"*******"} .. поэтому проблема может заключаться в том, что пароль содержит зарезервированный набор символов \" ?? И как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Теперь пароль имеет следующий формат:

\"*******

Где он начинается с 2 зарезервированных символов \"

Если ваши пароли действительно приходят из JSON, такие как{"PASSWORD":"\"*******"}, ваши пароли не начинаются с \" - они начинаются с ", потому что \ - это просто JSON escape-символ необходимо вставить литерал " в char.в (всегда в двойных кавычках) строковом значении JSON.

Другими словами: если вы правильно проанализируете свой JSON, фактическое значение пароля будет:

"*******

. Вы можете проверить это какследует:

PS> ('{ "PASSWORD": "\"*******" }' | ConvertFrom-Json).PASSWORD
"*******

Ваша следующая проблема заключается в том, что вы встраиваете пароль в строку, представляющую исходный код PowerShell , и внутри этой строки выВы используете (встроенный) в одинарных кавычках ('...') для окружения значения [1] .
Для этого вы должны экранировать вложенные значения ' в виде '', чтобы не вызывать синтаксическую ошибку при последующем анализе PowerShell кода:

// Note the .Replace() calls
string PsCmd = "add-pssnapin VMware.VimAutomation.Core; $vCenterServer = '" +
  vCenterName.Trim().Replace("'", "''") + "';$vCenterAdmin = '" + 
  vCenterUsername.Trim().Replace("'", "''") + 
  "' ;$vCenterPassword = '" + vCenterPassword.Replace("'", "''") + "';" + 
  System.Environment.NewLine;

При буквальном значении пароля "***'*** (и примеры значений для центра и имени пользователя), переменная C # PSCmd получит строку со следующим буквенным содержанием :

add-pssnapin VMware.VimAutomation.Core; $vCenterServer = 'center1';$vCenterAdmin = 'jdoe' ;$vCenterPassword = '"***''***';

[1] И одинарные кавычки являются правильным выбором, потому что использование двойных кавычек может привести к нежелательномуetation (интерполяция строк) встроенного значения с помощью PowerShell.

0 голосов
/ 12 ноября 2018

Вам нужно сбежать от ". Вы делаете это в PowerShell, используя символ `, например `"

Попробуйте это:

string PsCmd = "Add-PSSnapin VMware.VimAutomation.Core; $vCenterServer = '" + vCenterName.Trim() + "'; $vCenterAdmin = '" + vCenterUsername.Trim() + "'; $vCenterPassword = \"" + vCenterPassword.Replace("\"", "`\"") + "\";" + System.Environment.NewLine;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...