Диагностика Here-Strings с помощью PowerShell_ISE

Джеймс Брандейдж (James Brundage) опубликовал в блоге заметку «Как написать консольное приложение на PowerShell, с помощью Add-Type» в которой используется here-string. Один пользователь (lcr) скопировал и вставил текст, и получил следующую ошибку:

Unrecognized token in source text.
At line:1 char:72
+ Add-Type -OutputType ConsoleApplication -OutputAssembly HelloWorld.exe <
<<< @"
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorReco
rdException
+ FullyQualifiedErrorId : UnrecognizedToken

Я сделал то же самое, скопировал текст в консоль и получил ту же ошибку. Это показалось мне странным, так что я загрузил PowerShell_ISE и вставил туда содержимое буфера обмена. Проблема немедленно стала понятна. Вот что я увидел:

Powershell ISE syntax

Заметьте, что блок Here-String окрашен в черный цвет. Эта часть должна была быть коричневой. Это почти всегда означает, что я поставил лишний пробел после @" . Вот, что справка About_quoting_rules говорит о Here-Strings:

A here-string has the following format, where <Enter> represents
the linefeed or newline hidden character that is added when you press
the <Enter> key.

    @"<Enter>
<string> [string] ...<Enter>
"@

       - or -

    @'<Enter>
<string> [string] ...<Enter>
'@

    In either format, the closing quote must be the first character
on the line.

Я думаю, что программа, использованная для публикации сообщений в блог (или браузер), вероятно, поставили дополнительный пробел после ", в тот момент, когда Джеймс писал свое сообщение. Найдя лишний пробел, я удалил его, и отображение кода изменилось (заметьте, что строка here-string стала коричневой):

 

Powershell ISE syntax

Это одно из преимуществ подсветки синтаксиса в PowerShell_Ise. Мы думаем что знаем, что мы видим, когда смотрим на экран, но подсветка синтаксиса говорит нам, правда ли это. Вам следует уделить несколько минут на то, чтобы остановиться и посмотреть, что на самом деле делает подсветка синтаксиса и что означает каждый из цветов. После этого возьмите свой сценарий и безжалостно начните ломать его такими штуками, как лишние скобки, фигурные скобки, кавычки, орфографические ошибки и т.д. и т.п.. Обратите внимание как подсветка синтаксиса будет или не будет показывать подобные ошибки. Потратьте немного времени на то, чтобы разобраться с этим, и когда вы поместите текст программы в ISE, подсветка станет для вас настоящим средством диагностики. Я думаю, вы обнаружите, что подсветка синтаксиса не всегда высвечивает проблемы (именно это вы должны понять – нужно разобраться, когда она помогает, а когда нет). После того, как вы что нибудь сломаете, вы должны сохранить файл и попробовать выполнить его. Затем получить runtime error и узнать, как ошибки исполнения кода связаны с изменениями в коде (это будет легко, поскольку вы только что их внесли.)

Уделите немного времени этим вопросам сейчас, чтобы уметь эффективно решать проблемы, когда придет время.

Наслаждайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    https://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  https://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков