Проблема с PowerShell - оператор IF в фигурных скобках
Я столкнулся с чем-то с PS, и я не знаю, делаю ли я что-то не так или, может быть, это просто ошибка в PS (и я нигде не могу найти ответ)? Я проверял это на PS v4, v5.0 и v5.1, используя разные ОС Windows. Во-первых, кажется, что независимо от того, какая ОС и какая версия PS, когда я запускаю следующий фрагмент кода ниже либо непосредственно через окно PS, либо через сценарий PS, я не получаю ошибок, и все выглядит нормально:
$error.clear()
If ($error -ne $null) { $error }
Тем не менее, на определенных типах систем (похоже, проблема на основе ОС), я запускаю следующий код, и иногда я получаю сообщение об ошибке:
$error.clear()
If ($error -ne $null)
{
$error
}
Я могу запустить приведенный выше код, генерирующий ошибки, на серверах Windows 10 и Windows 2016, и все в порядке (об ошибках не сообщается). Если я запускаю точно такой же код в Windows 2008 R2 или Windows 2012 R2, я получаю следующее сообщение об ошибке:
Missing statement block after If ( condition ).
Кажется, не имеет значения, установлен ли у меня PS 4, 5 или 5.1.1 в системах Windows 2008 R2 и Windows 2012 R2, я все еще получаю сообщение об ошибке. И, кажется, не имеет значения, работаю ли я от имени администратора или нет, результаты те же. И, кажется, не имеет значения, являются ли они присоединенными к домену или системами рабочих групп. Все наши системы исправлены с момента обновления вторника, выпущенного в мае 2017 года.
Является ли требованием PS (в системах Windows 2008 R2 и Windows 2012 R2), что открывающая фигурная скобка оператора PS "IF" должна быть в той же строке, что и сам оператор IF? Похоже, что это не так для Windows 10 и Windows 2016 server.
Заранее спасибо,
UCG
2 ответа
Когда PowerShell получает строку (или блок) кода - он оценивает этот блок (или строку) в целом
В этом случае ваша первая строка: If ($error -ne $null)
PowerShell знает, как взаимодействовать с линией, но имеет неверный синтаксис, потому что PowerShell не имеет блока "что делать" в случае выполнения критериев.
Если вы передаете PowerShell блок в целом - он распознает блок "что делать" и знает, куда ему нужно идти дальше:
Можете ли вы более подробно рассказать о том, какие системы и платформы, которые вы находите, поддерживают одну строку? Я только что проверил это на Win10 (PowerShell 5), 2012R2 (Powershell 4 и 5), Windows 7 (PowerShell 4 и 5), и все они ведут себя одинаково.
У меня была такая же проблема, когда мой блок операторов включал здесь-строку
If ($error -ne $null)
{
$query = @"
do some sql;
do more sql;
"@
}
Когда я изменил его на одну строку без строки здесь, это работало
If ($error -ne $null)
{
$query = "do some sql;do more sql;"
}
В вашем блоке операторов может быть что-то, что PowerShell также не поддерживает как многострочное.
Powershell имеет два способа синтаксического анализа команд: режим выражения и режим аргумента. (см. https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-7.1)
Не имея различных операционных систем для тестирования, я могу предположить, что эти команды изменились из режима выражения в режим аргумента (или наоборот, в зависимости от того, какой путь вы выбрали) между вашими ОС.
Самый простой способ (лучший способ) - всегда оставлять открывающуюся фигурную скобку на верхней линии. Это позволяет команде / сценарию работать независимо от того, какой режим использует парсер.
Вы также можете принудительно продолжить строку, добавив обратную кавычку `в конец строки. Однако их трудно увидеть, и они могут вызвать другие проблемы, поэтому ваш пробег может отличаться.