Проблема с PowerShell - оператор IF в фигурных скобках

946
STGdb

Я сталкивался с чем-то с 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

3
Что произойдет, если ваша начальная фигурная скобка находится на той же строке, что и условие if, а не на следующей строке? Я знаю, что теоретически PowerShell не заботится о размещении вокруг фигурных скобок, но для полноты исключает что-либо, например странные символы новой строки и т. Д. Используете ли вы Блокнот, PowerShell IDE или другой редактор? Kinnectus 6 лет назад 0
это полностью зависит от используемого парсера. Я ожидаю, что анализатор powershell будет внутренним, но поскольку он будет работать с дюжиной различных диалектов сценариев, возможно, это не совсем правильно. В любом случае, я рекомендую использовать форматирование RKR и поместить фигурное отверстие в строку с оператором управления. Мне никогда не нравилось тратить целую строку с кудрявым открытием. Frank Thomas 6 лет назад 0
@Kinnectus - когда начальная фигурная скобка находится на одной строке, мы не получаем ошибок (но это относится только к Windows 2008 R2 и Windows 2012 R2). Windows 10 и Windows 2016, похоже, не возражают против того, будет ли скобка на новой строке или нет. STGdb 6 лет назад 0
@Frank Thomas - Запуск его прямо из окна PS (встроенного в ОС Windows) приводит к ошибке. Я развернул чистую серверную ОС в рабочей группе (непосредственно с носителя MS ISO), получил те же результаты на новом сервере 2012 R2 (на нем не было установлено ничего «лишнего», и ОС не была исправлена). Хотя это определенно связано с ОС. STGdb 6 лет назад 0
Многие наши (существующие) сценарии отформатированы таким образом (с открывающим оператором IF в фигурной скобке на новой строке) для удобства чтения. На днях я хотел добавить некоторые сообщения об ошибках в существующий сценарий, и при тестировании я заметил, что эта ошибка сообщается (и перехватывается), поэтому сценарий завершается. Я предполагаю, что это происходило какое-то время, и мы никогда не знали, что это было, пока я не попытался добавить что-то, отлавливающее ошибки. Спасибо вам обоим за ваши ответы. STGdb 6 лет назад 0
Что происходит, когда вы бежите с ISE? От ISE это завершилось без ошибок на Win 10 x64 v5.1, Win 7 x86 v2.0 и Win 2008 r2 x86 v2.0. При вводе непосредственно в Powershell я получаю сообщение об ошибке «Missing Statement» на машине с Win7, но не на машине с Win10. root 6 лет назад 0
@root - Да, те же результаты. Нет ошибок на Windows 10 или 2016 пока я получаю ошибку на 2008 R2 и 2012 R2 в ISE STGdb 6 лет назад 0
Можете ли вы подтвердить, на каком языке эти серверы с уязвимой проблемой или настроены и настроены для. Проверяли ли вы логику [TRY ... CATCH] (https://ss64.com/ps/try.html), чтобы увидеть, работает ли она по-другому с логикой проверки ошибок, которую вы пытаетесь включить? Существует также [Trap] (https://ss64.com/ps/trap.html), поэтому я просто хотел указать на это. Pimp Juice IT 6 лет назад 0
@ McDonald's - Хорошая идея, спасибо. Я протестировал Try / Catch и также получил ошибку (похоже, ошибка повторяла ту же схему, что и другая ошибка, не Win10 / 2016, а 2008R2 / 2012R2). Разница лишь в том, что с Try / Catch сообщение об ошибке другое. Я получаю сообщение об ошибке: «В операторе Try отсутствует блок оператора». Все они настроены на английский язык. STGdb 6 лет назад 0
Лучше всего сделать код 2008 R2 / 2012 R2 совместимым, чтобы внести изменения во все применимые сценарии. Возможно, вы могли бы заставить программу установки кода и сценариев запускаться с сервера 2016 года и удаленно запускаться на серверах 2008 и 2012 годов и посмотреть, существует ли такое же поведение или же на этом уровне с фигурной скобкой. Я знаю, как тяжело поддерживать сценарии на разных платформах, и не все стандартно для всех сред, где вы автоматизируете сценарии и т. Д., Поэтому я тоже знаю это чувство Pimp Juice IT 6 лет назад 0
Что с этим? Были ли у вас какие-либо новые открытия и т. Д.? Вы нашли другое решение, такое как обновление скриптов? Это может стоить награды в 50 баллов, чтобы привлечь больше внимания, если вам это абсолютно необходимо. Pimp Juice IT 6 лет назад 0

2 ответа на вопрос

0
Fazer87

Когда PowerShell получает строку (или блок) кода - он оценивает этот блок (или строку) в целом

В этом случае ваша первая строка: If ($error -ne $null)

PowerShell знает, как взаимодействовать с линией, но имеет неправильный синтаксис, потому что PowerShell не имеет блока «что делать» в случае выполнения критериев.

enter image description here

Если вы передаете PowerShell блок в целом - он распознает блок «что делать» и знает, куда ему нужно перейти:

enter image description here

Можете ли вы более подробно рассказать о том, какие системы и платформы, которые вы находите, поддерживают одну строку? Я только что проверил это на Win10 (PowerShell 5), 2012R2 (Powershell 4 и 5), Windows 7 (PowerShell 4 и 5), и все они ведут себя одинаково.

0
tgrignon

У меня была такая же проблема, когда мой блок операторов включал здесь-строку

If ($error -ne $null) { $query = @"  do some sql; do more sql;  "@ } 

Когда я изменил его на одну строку без здесь-строки, это работало

If ($error -ne $null) { $query = "do some sql;do more sql;" } 

В вашем блоке операторов может быть что-то, что PowerShell также не поддерживает как многострочное.