Резюме: Microsoft Scripting Guy, Ed Wilson разбирает особенности использования командлета Format-Wide.
Format-Wide? Что это?
Если быть честным, я редко использую командлет Format-Wide – в большинстве случаев, когда он может пригодиться, я о нем забываю. Он не входит в список моих любимых инструментов. Также я не считаю его незаменимым. Что означает, что могут существовать способы его использования, которые я еще не применял.
Если я получу список процессов при помощи командлета Get-Process, передам результаты командлету Format-Wide и выберу только имена, вывод получится довольно сумбурным.
Причиной этому разница в длине имен процессов. Интересно, есть ли способ отсортировать процессы по длине их имен. Благодаря этому список мог бы выглядеть лучше.
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
На рисунке приведена команда и ее вывод. Как вы видите, на этот раз он гораздо более аккуратный.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell