Windows PowerShell: Не забываем о пробелах

Надлежащее форматирование, в том числе пробелы в нужных местах, могут значительно повысить читабельность команд Windows PowerShell.

Дон Джонс

Посмотрите на следующую функцию и скажите, что по вашему мнению она делает. Это реальная, полнофункциональная «расширенная функция». Ваша задача просто сказать мне (не запуская ее), что она делает.

function Get-PCInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)][string[]]$computername ) PROCESS { Write-Verbose "Beginning PROCESS block" foreach ($computer in $computername) { Write-Verbose "Connecting to $computer" try {$continue = $true $cs = Get-WmiObject -EV mybad -EA Stop -Class Win32_computersystem -ComputerName $computer } catch {$continue = $false $computer | Out-File -FilePath oops.txt -append Write-Verbose "$computer failed" $mybad | ForEach-Object { Write-Verbose $_ } }if ($continue) { $proc = Get-WmiObject win32_processor -ComputerName $computer | select -first 1 $obj = new-object -TypeNamePSObject $obj | add-member NotePropertyComputerName $computer $obj | add-member NotePropertyProcArchitecture $proc.addresswidth $obj | add-member NoteProperty Domain $cs.domain $obj | add-memberNotePropertyPCModel $cs.model $obj.psobject.typenames.insert(0,'MyPCInfo') write-output $obj }}}}

Тяжело, не так ли? Причина в том, что в функции продемонстрированы слишком уж часто встречающиеся ошибки в сценариях, тысячи примеров которых можно найти в Интернете, и даже в папках на вашем компьютере. Здесь не используются дополнительные пробелы. А теперь посмотрите на тот же, но немного видоизмененный пример:

function Get-PCInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [string[]]$computername ) PROCESS { Write-Verbose "Beginning PROCESS block" foreach ($computer in $computername) { Write-Verbose "Connecting to $computer" try { $continue = $true $cs = Get-WmiObject -EV mybad -EA Stop ` -Class Win32_computersystem ` -ComputerName $computer } catch { $continue = $false $computer | Out-File -FilePath oops.txt -append Write-Verbose "$computer failed" $mybad | ForEach-Object { Write-Verbose $_ } } if ($continue) { $proc = Get-WmiObject win32_processor ` -ComputerName $computer | select -first 1 $obj = new-object -TypeNamePSObject $obj | add-member NotePropertyComputerName $computer $obj | add-member NotePropertyProcArchitecture $proc.addresswidth $obj | add-member NoteProperty Domain $cs.domain $obj | add-memberNotePropertyPCModel $cs.model $obj.psobject.typenames.insert(0,'MyPCInfo') write-output $obj } } } }

Теперь другое дело. Команды в фигурных скобках отформатированы отступами. Длинные команды аккуратно перенесены. Теперь все стало намного более читабельно.

Отлаживать сценарий также значительно проще, если текст сценария аккуратно отформатирован. Просто попытайтесь найти лишнюю или недостающую фигурную скобку в неотформатированном тексте. Лучше застрелиться. Проблема в том, что многие не знают, как делается такое форматирование. Давайте я расскажу, как решать проблему.

Отступы

Большинство редакторов сценариев отлично работают с клавишей Tab, в том числе Windows PowerShell ISE, который входит в состав установщика Windows PowerShell 2. В некоторых редакторах вместо символа табуляции вставляется четыре или пять пробелов, но это вполне нормально. В большинстве можно выделить блок команд и добавить отступ, нажав Tab, или отменить отступ комбинацией Shift+Tab.

Это удобно и подталкивает к содержанию кода в аккуратном виде за счет того, что эта операция легка и удобна. Большинство редакторов поддерживает автоотступ, когда при вводе строки и нажатии Enter курсор переходя на следующую строку размещается с тем же отступом, что и в предыдущей строке.

Разрывы строк

Это намного менее очевидный прием, особенно в сценариях Windows PowerShell. Смысл в том, чтобы предотвратить выравнивание по горизонтали за исключением тех случаев, когда это совершенно необходимо. Windows PowerShell позволяет разбить строку на любом символе так, чтобы оболочка воспринимала следующую строку как продолжение предыдущей. Для этого служат символы:

  • запятая;
  • точка с запятой;
  • вертикальная черта (|).

Взгляните на «улучшенный» вариант, и вы поймете, что я имею в виду.

Можно также использовать управляющий символ Windows PowerShell: обратную галочку (`). Если за обратной галочкой сразу следует возврат каретки, Windows PowerShell воспринимает это как продолжение строки. Иначе говоря, это похоже на символ продолжения строки. Но лично я ненавижу этот символ. Его плохо видно на экране и на бумаге, но очень легко спутать с битым пикселем на мониторе или каплей тонера на бумажной странице.

При его использовании также легко ошибиться. Если после обратной галочки добавить пробел, знак табуляции или другой плохо заметный пробельный символ, она не будет работать как символ продолжения строки. А знак возврата каретки не будет игнорироваться. Я использовал этот символ в «улучшенной» версии примера, просто чтобы показать все возможности. Можете спокойно игнорировать этот способ, если есть лучший вариант.

Последовательность форматирования

Очень важна последовательность форматирования, то есть использование одних и тех же приемов. Например, я предпочитаю такие конструкции:

if ($continue) { # some code goes here }

А другие предпочитают такое форматирование:

if ($continue) { # some code goes here }

Можно выбрать любой формат, но выбрав конкретный формат, следует его придерживаться. Задача в том, чтобы обеспечить последовательность и читабельность кода.

Вернитесь и исправьте форматирование

Выберите один из своих ужасно отформатированных сценариев и потратьте несколько минут на приведение форматирования в порядок. Наверняка человек, которому придется через полгода разбираться в вашем «творчестве», не раз скажет спасибо за понятный и аккуратно форматированный текст. И этим человеком можете вполне оказаться вы сами.

Don Jones

Дон Джонс (Don Jones) носит звание MVP и является автором «Learn Windows PowerShell in a Month of Lunches» (Manning Publications Co., 2010), книги, призванной помочь каждому администратору освоить Windows PowerShell. Дон читает общедоступные и интерактивные курсы по Windows PowerShell. Связаться с ним можно через его веб-сайт ConcentratedTech.com.