Weekend Scripter: Сортируем процессы по длине имени – Hey, Scripting Guy! Blog

Резюме: Microsoft Scripting Guy, Ed Wilson разбирает особенности использования командлета Format-Wide.

Format-Wide? Что это?

Если быть честным, я редко использую командлет Format-Wide – в большинстве случаев, когда он может пригодиться, я о нем забываю. Он не входит в список моих любимых инструментов. Также я не считаю его незаменимым. Что означает, что могут существовать способы его использования, которые я еще не применял.

Если я получу список процессов при помощи командлета Get-Process, передам результаты командлету Format-Wide и выберу только имена, вывод получится довольно сумбурным.

01

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

Format-Wide не содержит параметра length

Если я хочу, чтобы командлет Format-Wide выводил список процессов в порядке увеличения длины имени, мне потребуется отсортировать этот список до того, как он будет передан командлету. Однако объекты процессов не содержат свойства length, по которому я мог бы их отсортировать. Я полагаю, что мне нужно самому добавить в объект процесса свойство длина имени. Таким образом я смогу воспользоваться командлетом Sort-Object до передачи объектов командлету Format-Wide. Звучит как план, но как это реализовать?

Используем скриптблок в командлете Select-Object

Первое, что мне нужно сделать, это создать пользовательский объект (Custom Object) при помощи командлета Select-Object. Этот способ использования Select-Object для создания пользовательских объектов – один из моих любимых трюков Windows PowerShell. Я хочу получить длину имени каждого процесса, поэтому я первым делом передам результаты командлета Get-Process командлету Select-Object. Я достаточно просто могу выбрать свойство name, но для того, чтобы получить длину имени, мне сначала нужно удостовериться, что значение свойства name – это строка, а затем получить значение свойства строки (length). Команда для конвертации имени процесса в строку и получения свойства length приведена ниже.

13:57 C:\> (gps)[0].name.tostring().length

6

Итак, это работает. Теперь мне нужно, чтобы это действие выполнялось для каждого процесса. Для создания синтетического свойства я буду использовать синтаксис хеш-таблицы (это также возможно при работе с командлетами Format-Table и Format-List, но не для Format-Wide). Этот синтаксис используется для создания пользовательского имени и вычисляемого значения для стандартного свойства. Код, иллюстрирующий эту методику, приведен ниже.

14:01 C:\> gps | ft name, @{label=»length»;Expression={$_.name.tostring().Length}} -auto

Name length

—- ——

armsvc 6

audiodg 7

BtwRSupportService 18

Я просто заменю командлет Format-Table на Select-Object и создам нужный мне объект.

Get-Process |

Select-Object name, @{label=»length»;Expression={$_.name.tostring().Length}}

Собираем все вместе, сортируем и форматируем

Теперь мне нужно только отсортировать результаты по свойству length и передать их командлету Format-Wide. Конечно, Format-Wide способен работать только с одним свойством, поэтому свойство length придется отбросить. Полная команда приведена ниже, где gps – это алиас для Get-Process, select – алиас для Select-Object, sort – алиас для Sort-Object и fw – алиас для Format-Wide.

gps |

select name, @{label=»length»;Expression={$_.name.tostring().Length}} |

sort length |

fw -Property name -Column 5

На рисунке приведена команда и ее вывод. Как вы видите, на этот раз он гораздо более аккуратный.

02

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/02/02/weekend-scripter-sorting-process-names-by-length-of-name.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s