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. В неких редакторах заместо знака табуляции вставляется четыре либо 5 пробелов, но это полностью нормально. В большинстве можно выделить блок команд и добавить отступ, нажав Tab, либо отменить отступ композицией Shift+Tab.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Аналогичный товар: Комментирование на данный момент запрещено, но Вы можете оставить ссылку на Ваш сайт.

Комментарии закрыты.