Инструменты пользователя

Инструменты сайта


форматирование_вывода

Форматирование вывода

С помощью командлета Sort-Object можно упорядочить отображаемые данные для упрощения их проверки. Sort-Object принимает имя одного или нескольких свойств, по значениям которых выполняется сортировка, и возвращает данные, отсортированные по значениям этих свойств.

Пример сортировки объекта по длине, по убыванию

Get-ChildItem  C:\Windows | Sort-Object Length -Descending
 
    Directory: C:\Windows
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       21.07.2011      9:45       22253056 {1DE3B635-B213-11E0-89D3-C80AA9FF00CD}
-a----       22.05.2020      9:31        7217264 PFRO.log
-a---l       29.08.2016     18:04        3229696 explorer.exe
             25.05.2020     10:25        1272128 WindowsUpdate.log

Выбор частей объектов (Select-Object)

Командлет Select-Object позволяет создавать новые пользовательские объекты PowerShell со свойствами, выбранными из объектов, которые используются для их создания.

Посмотрим, какие есть свойства у файла

Get-ChildItem C:\Windows | Get-Member -MemberType Properties

И попробуем их получить, я выбрал FullName и Extension

Get-ChildItem C:\Windows | Select-Object -Property FullName, Extension
FullName                                              Extension
-------                                               ---------
...
C:\Windows\1stRozn.txt                                .txt
C:\Windows\apptune1020.exe                            .exe
C:\Windows\ARJ.PIF                                    .PIF
C:\Windows\bfsvc.exe                                  .exe
C:\Windows\bootstat.dat                               .dat
...

Теперь создадим собственное свойство файла, добавим колонку в которой будет отображаться длина файла в MB. Для этого используем следующею конструкцию с оператором массива - @. Как получить размер директории можно посмотреть тут

dir C:\Windows | Select-Object FullName, Extension, @{Name="Size_In_MB";Expression={$_.Length / 1MB}}

либо такую

Get-ChildItem | Select-Object FullName, Extension, @{n='SIze in MB'; e={$PSItem.Length / 1MB}}

$PSItem — применяется для передачи значения при использовании конвейера. Специальная переменная $PSItem принимает текущее значение каждого объекта, переданного по конвейеру. На сегодняшний день, более популярное написание $PSItem$_

Фильтрация

В PowerShell есть командлет Where-Object, который позволяет протестировать каждый объект в конвейере и передать его дальше, только если он удовлетворяет определенному условию теста. Объекты, не прошедшие проверку, удаляются из конвейера. Условие теста передается в виде значения параметра FilterScript.

Значение FilterScript представляет собой блок сценария (одну или несколько команд PowerShell, заключенных в фигурные скобки {}), который возвращает значение True или False. Такие блоки сценариев могут быть очень простыми, но для их создания требуется понимание другой концепции PowerShell, а именно операторов сравнения. Оператор сравнения сравнивает элементы, расположенные с обеих сторон оператора. Запись операторов сравнения начинается знаком дефиса -, после которого следует имя оператора. Основные операторы сравнения работают, как правило, с любыми видами объектов. Более сложные операторы сравнения работают только с текстом или массивами.

Исходя из соображений синтаксического анализа, такие знаки, как <, > и =, не используются в качестве операторов сравнения. Вместо этого операторы сравнения записываются в буквенной форме. Основные операторы сравнения перечислены в таблице ниже.

Оператор сравнения значение
-eq равно
-ne не равно
-lt меньше
-le меньше или равно
-gt больше
-ge больше или равно
-like сравнение на совпадение с учетом подстановочного знака в тексте

Самый простой пример

1,2,3,4 | Where-Object {$_ -lt 3}
1
2

Выведем все объекты, дина которых > 200000 байт

Get-ChildItem C:\Windows | Where-Object Length -GT 200000

Посмотрим на все объекты с расширением exe

Get-ChildItem C:\Windows | Where-Object Extension -eq '.exe'

Проверим, есть ли файлы имя которых начинается на e

Get-ChildItem C:\Windows | Where-Object Name -Like 'e*'

Отфильтруем процессы по статусу: running

Get-Service | Where-Object {$_.Status -eq 'Running'}

Зададим несколько условий. Найдем все файлы с расширением exe, начинающиеся на букву h и чей размер более 100000 байт

dir 'C:\Windows' | where {$_.Extension -like '.exe' -and $_.Name -like 'h*' -and $_.Length -gt 100000}

Агрегация (Measure-Object)

Measure-Object агрегирует различные сводные параметры по значениям полей объектов в конвейере (вычисляет сумму, а также находит минимальное, максимальное или среднее значение).

Как всегда, начнем с самого простого примера

"One", "Two", "Three", "Four" | Set-Content -Path C:\Temp\tmp.txt
Get-Content C:\Temp\tmp.txt | Measure-Object -Character -Line -Word
 
Lines Words Characters Property
----- ----- ---------- --------
    4     4         15

Подсчитаем кол-во файлов в определенной директории, выведем их общую сумму, максимальное и минимальное значение

dir C:\Path\to\dir -Recurse | Measure-Object -Property Length -Sum -Maximum -Minimum

Группировка объектов(Group-Object)

Group-Object помещает объекты в группы на основе какого-либо свойства. Это может быть существующее или пользовательское свойство.

Как всегда, посмотрим на самый простой пример

Get-Service | Group-Object Status -NoElement
 
Count Name                     
----- ----                     
  121 Running                  
  106 Stopped 

Для примера отсортируем кол-во объектов по расширению файла. Параметр NoElement – указывается для исключения групп файлов из вывода.

Dir C:\py -File -Recurse | Group Extension -NoElement | Sort Count -Descending
Count Name                     
----- ----                     
 1299 .py                      
 1226 .pyc                     
  171 .dll                     
  148 .html                    
   81 .pyd 

Удаление всех объектов с расширением log

dir C:\Windows | where Extension -EQ ".log" | ForEach-Object Delete

Или удалим все файлы с расширением txt вот таким методом

dir C:\Windows\Temp | where Extension -EQ ".txt" | ForEach-Object {$_.Delete()}

PowerShell скрипты

форматирование_вывода.txt · Последнее изменение: 2020/05/26 17:57 — 82.204.251.18