5. PowerShell Pipeline
Pipeline — сила PowerShell
Заголовок раздела «Pipeline — сила PowerShell»Pipeline в PowerShell работает иначе, чем в bash. В bash по конвейеру передаётся текст. В PowerShell — объекты. Это принципиальное отличие, которое делает PowerShell намного мощнее для автоматизации.
# В bash: парсим текстps aux | grep chrome | awk '{print $2}'
# В PowerShell: работаем с объектами!Get-Process chrome | Select-Object Id, Name, CPUОператор | (пайп)
Заголовок раздела «Оператор | (пайп)»# Базовый пайпGet-Process | Get-Member # посмотреть свойства объектовGet-Service | Format-Table # форматировать выводGet-ChildItem | Sort-Object Length # сортировать файлы по размеруWhere-Object — фильтрация объектов
Заголовок раздела «Where-Object — фильтрация объектов»Where-Object (алиас: ? или where) фильтрует объекты по условию.
# Синтаксис с блоком скриптаGet-Process | Where-Object { $_.CPU -gt 50 }Get-Service | Where-Object { $_.Status -eq "Running" }Get-ChildItem | Where-Object { $_.Extension -eq ".txt" }
# Краткий синтаксис (PS 3+)Get-Process | Where-Object CPU -gt 50Get-Service | Where-Object Status -eq "Running"Get-ChildItem | Where-Object Name -like "*.txt"
# АлиасыGet-Process | ? { $_.CPU -gt 50 } # ? = Where-Object
# Операторы сравнения в Where-Object# -eq равно# -ne не равно# -gt больше# -lt меньше# -ge больше или равно# -le меньше или равно# -like маска (* = любые символы)# -match регулярное выражение# -in входит в список
Get-Process | Where-Object Name -in @("chrome", "firefox", "edge")Get-ChildItem | Where-Object Name -match "^\d{4}" # начинается с 4 цифрSelect-Object — выбор свойств и объектов
Заголовок раздела «Select-Object — выбор свойств и объектов»# Выбрать свойстваGet-Process | Select-Object Name, CPU, Id, WorkingSet64
# Вычисляемые свойстваGet-Process | Select-Object Name, @{ Name = "MemoryMB" Expression = { [Math]::Round($_.WorkingSet64 / 1MB, 2) }}
# Первые/последние N объектовGet-Process | Select-Object -First 5Get-Process | Select-Object -Last 5Get-Process | Select-Object -Skip 10 -First 5 # с 11-го по 15-й
# Уникальные значенияGet-Process | Select-Object -ExpandProperty Name | Sort-Object -Unique
# Исключить свойстваGet-Process | Select-Object -ExcludeProperty Id, SessionIdSort-Object — сортировка
Заголовок раздела «Sort-Object — сортировка»# По одному полюGet-Process | Sort-Object CPU # возрастаниеGet-Process | Sort-Object CPU -Descending # убывание
# По нескольким полямGet-Process | Sort-Object @( @{Expression = "CPU"; Descending = $true}, @{Expression = "Name"; Ascending = $true})
# Сортировка строк"banana", "apple", "cherry" | Sort-Object
# Уникальные значенияGet-ChildItem | Sort-Object Extension -UniqueForEach-Object — обработка каждого объекта
Заголовок раздела «ForEach-Object — обработка каждого объекта»# Базовый синтаксисGet-Process | ForEach-Object { Write-Output $_.Name }
# Краткий синтаксисGet-Process | ForEach-Object Name
# Делать что-то с каждым объектомGet-ChildItem *.txt | ForEach-Object { $content = Get-Content $_.FullName Write-Output "$($_.Name): $($content.Count) строк"}
# Алиас % = ForEach-Object1..10 | % { $_ * 2 }
# Begin/Process/End блоки1..5 | ForEach-Object -Begin { Write-Output "Начало"} -Process { Write-Output "Обрабатываю: $_"} -End { Write-Output "Конец"}Measure-Object — статистика
Заголовок раздела «Measure-Object — статистика»Get-Process | Measure-Object CPU -Sum -Average -Maximum -MinimumGet-ChildItem | Measure-Object Length -Sum -Average"Hello World" | Measure-Object -Word -Character -LineGet-Content log.txt | Measure-Object -LineGroup-Object — группировка
Заголовок раздела «Group-Object — группировка»Get-Process | Group-Object Name # группировать по имениGet-ChildItem | Group-Object Extension # группировать по расширениюGet-Service | Group-Object Status # Running/StoppedGet-Process | Group-Object -Property {$_.CPU -gt 1 ? "High" : "Low"}Tee-Object — разветвление потока
Заголовок раздела «Tee-Object — разветвление потока»Get-Process | Tee-Object -FilePath processes.txt | Where-Object CPU -gt 5# Запишет все процессы в файл И покажет только с CPU > 5Реальные примеры
Заголовок раздела «Реальные примеры»# Топ-5 процессов по памяти в МБGet-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 | Select-Object Name, @{N="MB"; E={[Math]::Round($_.WorkingSet64/1MB, 1)}}
# Список запущенных сервисов с именем и описаниемGet-Service | Where-Object Status -eq "Running" | Select-Object Name, DisplayName | Sort-Object Name | Format-Table -AutoSize
# Файлы изменённые за последние 7 днейGet-ChildItem -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } | Select-Object Name, LastWriteTime, Length | Sort-Object LastWriteTime -Descending
# Статистика по расширениям файловGet-ChildItem -Recurse -File | Group-Object Extension | Select-Object Name, Count, @{N="SizeKB"; E={[Math]::Round(($_.Group | Measure-Object Length -Sum).Sum / 1KB, 1)}} | Sort-Object Count -DescendingПрактика
Заголовок раздела «Практика»# 1. Найди все процессы Chrome/EdgeGet-Process | Where-Object Name -in @("chrome", "msedge", "firefox")
# 2. Топ-3 по CPUGet-Process | Sort-Object CPU -Descending | Select-Object -First 3 | Select-Object Name, CPU
# 3. Статистика памятиGet-Process | Measure-Object WorkingSet64 -Sum -Average | Select-Object @{N="TotalMB"; E={[Math]::Round($_.Sum/1MB)}}, @{N="AvgMB"; E={[Math]::Round($_.Average/1MB)}}
# 4. Запущенные сервисыGet-Service | Where-Object Status -eq "Running" | Measure-Object
# 5. Файлы в System32 по расширению (первые 5 групп)Get-ChildItem C:\Windows\System32 | Group-Object Extension | Sort-Object Count -Descending | Select-Object -First 5Pipeline — это то, что делает PowerShell действительно мощным инструментом для автоматизации!