Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
EF StartUp Manager - программа для слежением за программами, которые запускаются вместе с загрузкой операционной системы...
EF Mailbox Manager - программа для периодической проверки неограниченного количество аккаунтов электронной почты. Вы мож...
Программа позволяет узнать, чем занято место на жестком диске. Сканирует папки очень быстро и выводит наглядную диаграмм...
HashMyFiles - это маленькая утилита, которая предоставляет возможность рассчета контрольных сумм MD5 и SHA1 для одного и...
Файловый менеджер с очень малыми системными требованиями, но тем не менее с большими возможностями. Программа имеет ориг...
OSzone.net Microsoft PowerShell Windows PowerShell: Не забываем о пробелах RSS

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

Текущий рейтинг: 4 (проголосовало 5)
 Посетителей: 2969 | Просмотров: 4071 (сегодня 0)  Шрифт: - +

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

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
}

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

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

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

Автор: Дон Джонс  •  Иcточник: TechNet Magazine  •  Опубликована: 12.03.2012
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:   Powershell.


Оценить статью:
Вверх
Комментарии посетителей RSS

Чтобы оставить комментарий, зарегистрируйтесь или войдите с учетной записью социальной сети.