PowerShell это не просто командная строка с красивым именем. Это язык, на котором Windows разговаривает сама с собой: тихо, методично, без лишних движений. Пока одни администраторы кликают по меню и ждут, пока откроется нужный раздел панели управления, другие уже получили результат, записали его в CSV, отфильтровали по условию и отправили на три сервера одновременно. https://seberd.ru/19548/
Этот справочник собирался не ради полноты ради полноты. За каждой командой здесь стоит реальная задача: разобраться, что происходит в системе прямо сейчас; найти того, кто съедает всю память; понять, почему служба упала в три часа ночи; не дать коллеге случайно удалить не ту OU.
PowerShell умеет быть простым одна строка, один результат. И умеет быть сложным — параллельные задания, удалённые сессии, модули для Azure и Microsoft 365, интеграция с секретными хранилищами. Разница между джуниором и сеньором здесь нередко измеряется не знанием синтаксиса, а пониманием того, когда писать Where-Object, а когда нормальный foreach с условием внутри.

# ============================================================
# SEBERD MONITOR — красивый системный монитор для PowerShell
# Требования: PowerShell 5.1+, Windows
# Запуск: .\seberd-monitor.ps1
# ============================================================
#region — ANSI-цвета и символы
$ESC = [char]27
function c($r,$g,$b) { "$ESC[38;2;${r};${g};${b}m" }
function bg($r,$g,$b) { "$ESC[48;2;${r};${g};${b}m" }
function Reset { "$ESC[0m" }
function Bold { "$ESC[1m" }
function Dim { "$ESC[2m" }
function ClearScreen { "$ESC[2J$ESC[H" }
function MoveTo($row,$col) { "$ESC[${row};${col}H" }
function HideCursor { "$ESC[?25l" }
function ShowCursor { "$ESC[?25h" }
# Палитра SEBERD (тёмный киберпанк, оранжевые акценты)
$COL = @{
Orange = c 255 140 0
OrangeDim = c 180 90 0
Amber = c 255 191 0
Cyan = c 0 210 220
CyanDim = c 0 130 140
Green = c 80 220 80
GreenDim = c 40 140 40
Red = c 255 70 70
RedDim = c 160 40 40
Yellow = c 255 230 80
White = c 220 220 220
Gray = c 110 110 110
DarkGray = c 60 60 60
BgDark = bg 10 12 18
BgPanel = bg 18 22 32
BgHeader = bg 25 30 45
BgBar = bg 30 35 50
}
#endregion
#region — Функции отрисовки
function Draw-HLine($col, $width, $char = '─') {
$COL.DarkGray + ($char * $width) + (Reset)
}
function Draw-Box($row, $col, $width, $height, $title = '') {
$R = Reset
$BC = $COL.DarkGray
$TC = $COL.Orange + (Bold)
# Верхняя граница
$top = $BC + '╔' + ('═' * ($width - 2)) + '╗' + $R
Write-At $row $col $top
# Заголовок
if ($title) {
$titleStr = " $title "
$pos = [math]::Floor(($width - $titleStr.Length) / 2)
Write-At $row ($col + $pos) ($TC + $titleStr + $R)
}
# Боковые стенки
for ($r = 1; $r -lt $height - 1; $r++) {
Write-At ($row + $r) $col ($BC + '║' + $R)
Write-At ($row + $r) ($col + $width - 1) ($BC + '║' + $R)
}
# Нижняя граница
$bot = $BC + '╚' + ('═' * ($width - 2)) + '╝' + $R
Write-At ($row + $height - 1) $col $bot
}
function Write-At($row, $col, $text) {
Write-Host (MoveTo $row $col) -NoNewline
Write-Host $text -NoNewline
}
function Draw-Bar($value, $max, $width, $label = '', $unit = '%') {
$pct = if ($max -gt 0) { [math]::Min([math]::Round($value / $max * 100), 100) } else { 0 }
$filled = [math]::Round($pct / 100 * $width)
$empty = $width - $filled
# Цвет бара по загрузке
$barColor = if ($pct -lt 50) { $COL.Green }
elseif ($pct -lt 80) { $COL.Amber }
else { $COL.Red }
$bar = $COL.BgBar + $barColor + ('█' * $filled) + $COL.DarkGray + ('░' * $empty) + (Reset)
$pctStr = "$pct$unit".PadLeft(5)
$labelStr = if ($label) { ($COL.Gray + $label.PadRight(8) + (Reset)) } else { '' }
return "$labelStr$bar $barColor$pctStr$(Reset)"
}
function Draw-MiniBar($value, $max, $width) {
$pct = if ($max -gt 0) { [math]::Min([math]::Round($value / $max * 100), 100) } else { 0 }
$filled = [math]::Round($pct / 100 * $width)
$empty = $width - $filled
$barColor = if ($pct -lt 50) { $COL.Green } elseif ($pct -lt 80) { $COL.Amber } else { $COL.Red }
return $barColor + ('▓' * $filled) + $COL.DarkGray + ('░' * $empty) + (Reset)
}
function Format-Bytes($bytes) {
if ($bytes -ge 1TB) { "{0:N1} TB" -f ($bytes / 1TB) }
elseif ($bytes -ge 1GB) { "{0:N1} GB" -f ($bytes / 1GB) }
elseif ($bytes -ge 1MB) { "{0:N1} MB" -f ($bytes / 1MB) }
elseif ($bytes -ge 1KB) { "{0:N1} KB" -f ($bytes / 1KB) }
else { "$bytes B" }
}
function Format-Uptime($ts) {
"{0}d {1:D2}h {2:D2}m {3:D2}s" -f $ts.Days, $ts.Hours, $ts.Minutes, $ts.Seconds
}
#endregion
#region — Сбор данных
function Get-SystemData {
$os = Get-CimInstance Win32_OperatingSystem
$cpu = Get-CimInstance Win32_Processor
$cs = Get-CimInstance Win32_ComputerSystem
$disks = Get-CimInstance Win32_LogicalDisk | Where-Object DriveType -eq 3
$net = Get-NetAdapter | Where-Object Status -eq 'Up' | Select-Object -First 1
$netStat = Get-NetAdapterStatistics -Name $net.Name -ErrorAction SilentlyContinue
# CPU Load (среднее по всем ядрам)
$cpuLoad = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average
# RAM
$ramTotal = $os.TotalVisibleMemorySize * 1KB
$ramFree = $os.FreePhysicalMemory * 1KB
$ramUsed = $ramTotal - $ramFree
# Uptime
$uptime = (Get-Date) - $os.LastBootUpTime
# Топ-процессы по CPU
$procs = Get-Process | Where-Object CPU -ne $null |
Sort-Object CPU -Descending | Select-Object -First 12
# Макс CPU для нормировки
$maxCPU = ($procs | Measure-Object -Property CPU -Maximum).Maximum
if ($maxCPU -le 0) { $maxCPU = 1 }
return @{
Hostname = $env:COMPUTERNAME
OS = $os.Caption
CpuName = $cpu.Name -replace '\s+', ' '
CpuCores = $cpu.NumberOfLogicalProcessors
CpuLoad = $cpuLoad
RamTotal = $ramTotal
RamUsed = $ramUsed
RamFree = $ramFree
Disks = $disks
NetName = $net.InterfaceDescription
NetRx = if ($netStat) { $netStat.ReceivedBytes } else { 0 }
NetTx = if ($netStat) { $netStat.SentBytes } else { 0 }
Uptime = $uptime
Procs = $procs
MaxCPU = $maxCPU
ProcCount = (Get-Process).Count
Time = Get-Date
}
}
#endregion
#region — Отрисовка UI
function Draw-UI($d) {
$W = $Host.UI.RawUI.WindowSize.Width
if ($W -lt 80) { $W = 80 }
$R = Reset
$ARROW = $COL.OrangeDim + '▸' + $R
# ══════════════════════ ШАПКА ══════════════════════
$header = "$($COL.BgHeader)$($COL.Orange)$(Bold)"
$ts = $d.Time.ToString("HH:mm:ss")
$date = $d.Time.ToString("dd.MM.yyyy")
Write-At 1 1 ($header + " ▓▓ SEBERD MONITOR ".PadRight($W - 20) + " $date $ts " + $R)
Write-At 2 1 ($COL.DarkGray + ('─' * $W) + $R)
# Hostname / OS
Write-At 3 3 ("$($COL.Gray)HOST $ARROW $($COL.Cyan)$(Bold)$($d.Hostname)$R " +
"$($COL.Gray)OS $ARROW $($COL.White)$($d.OS)$R " +
"$($COL.Gray)UPTIME $ARROW $($COL.Amber)$(Format-Uptime $d.Uptime)$R")
Write-At 4 1 ($COL.DarkGray + ('─' * $W) + $R)
# ══════════════════════ CPU ══════════════════════
Write-At 5 3 ($COL.Orange + "$(Bold)▶ CPU$R " +
$COL.Gray + ($d.CpuName.Substring(0, [math]::Min(50, $d.CpuName.Length))) +
$COL.DarkGray + " [$($d.CpuCores) threads]" + $R)
$cpuBar = Draw-Bar $d.CpuLoad 100 ($W - 16) '' '%'
Write-At 6 3 $cpuBar
# ══════════════════════ RAM ══════════════════════
Write-At 8 3 ($COL.Cyan + "$(Bold)▶ MEM$R " +
$COL.Gray + "Used: " + $COL.White + (Format-Bytes $d.RamUsed) +
$COL.Gray + " Free: " + $COL.GreenDim + (Format-Bytes $d.RamFree) +
$COL.Gray + " Total: " + $COL.White + (Format-Bytes $d.RamTotal) + $R)
$ramBar = Draw-Bar $d.RamUsed $d.RamTotal ($W - 16) '' '%'
Write-At 9 3 $ramBar
Write-At 10 1 ($COL.DarkGray + ('─' * $W) + $R)
# ══════════════════════ ДИСКИ ══════════════════════
Write-At 11 3 ($COL.Amber + "$(Bold)▶ DISK$R")
$dRow = 12
foreach ($disk in $d.Disks) {
$used = $disk.Size - $disk.FreeSpace
$label = "$($disk.DeviceID) $(Format-Bytes $used) / $(Format-Bytes $disk.Size)"
$bar = Draw-Bar $used $disk.Size 30 '' '%'
Write-At $dRow 3 ("$($COL.White)$($disk.DeviceID)$R $bar $($COL.Gray)$(Format-Bytes $disk.FreeSpace) free$R" + (' ' * 10))
$dRow++
}
$sepRow = $dRow + 1
Write-At $sepRow 1 ($COL.DarkGray + ('─' * $W) + $R)
# ══════════════════════ СЕТЬ ══════════════════════
$nRow = $sepRow + 1
Write-At $nRow 3 ($COL.Green + "$(Bold)▶ NET$R " +
$COL.Gray + ($d.NetName.Substring(0, [math]::Min(45, $d.NetName.Length))) + $R)
Write-At ($nRow + 1) 3 (
$COL.Gray + "RX total: " + $COL.Green + (Format-Bytes $d.NetRx) +
$COL.Gray + " TX total: " + $COL.Amber + (Format-Bytes $d.NetTx) + $R
)
Write-At ($nRow + 2) 1 ($COL.DarkGray + ('─' * $W) + $R)
# ══════════════════════ ПРОЦЕССЫ ══════════════════════
$pRow = $nRow + 3
$colCPU = 8
$colMEM = 12
$colBar = 22
$colPID = $colBar + 22
$colName = $colPID + 8
# Заголовок таблицы
Write-At $pRow 3 (
$COL.Orange + "$(Bold)▶ PROCESSES$R " +
$COL.Gray + "total: $($d.ProcCount)$R"
)
$pRow++
Write-At $pRow 3 (
$COL.DarkGray +
"CPU(s)".PadLeft($colCPU) + " " +
"MEM".PadLeft($colMEM) + " " +
"CPU BAR " +
"PID".PadLeft(7) + " " +
"NAME" + $R
)
$pRow++
Write-At $pRow 3 ($COL.DarkGray + ('╌' * ($W - 6)) + $R)
$pRow++
foreach ($proc in $d.Procs) {
$cpu = [math]::Round($proc.CPU, 1)
$mem = $proc.WorkingSet64
$bar = Draw-MiniBar $cpu $d.MaxCPU 20
$cpuStr = ("{0,7:N1}" -f $cpu)
$memStr = (Format-Bytes $mem).PadLeft(10)
$pidStr = ($proc.Id.ToString()).PadLeft(7)
$name = $proc.ProcessName.Substring(0, [math]::Min(28, $proc.ProcessName.Length))
# Цвет строки
$pct = if ($d.MaxCPU -gt 0) { $cpu / $d.MaxCPU * 100 } else { 0 }
$nameColor = if ($pct -gt 70) { $COL.Red }
elseif ($pct -gt 40) { $COL.Amber }
else { $COL.White }
Write-At $pRow 3 (
$COL.Cyan + $cpuStr + "s " +
$COL.Green + $memStr + " " +
$bar + " " +
$COL.Gray + $pidStr + " " +
$nameColor + $name + $R +
(' ' * 5)
)
$pRow++
}
# ══════════════════════ ПОДВАЛ ══════════════════════
$lastRow = $pRow + 1
Write-At $lastRow 1 ($COL.DarkGray + ('─' * $W) + $R)
Write-At ($lastRow + 1) 3 (
$COL.Gray + "$(Bold)Q$R$($COL.DarkGray) quit " +
$COL.Gray + "$(Bold)R$R$($COL.DarkGray) refresh " +
$COL.OrangeDim + "seberd.ru" + $R +
(' ' * ($W - 35))
)
}
#endregion
#region — Главный цикл
Write-Host (HideCursor) -NoNewline
Write-Host (ClearScreen) -NoNewline
$refreshSec = 2
$running = $true
# Перехват Ctrl+C
[Console]::TreatControlCAsInput = $true
try {
while ($running) {
$data = Get-SystemData
Write-Host (ClearScreen) -NoNewline
Draw-UI $data
# Ждём $refreshSec секунд или нажатия клавиши
$elapsed = 0
while ($elapsed -lt $refreshSec * 10) {
Start-Sleep -Milliseconds 100
$elapsed++
if ([Console]::KeyAvailable) {
$key = [Console]::ReadKey($true)
switch ($key.Key) {
'Q' { $running = $false; break }
'Escape' { $running = $false; break }
'R' { $elapsed = 9999 } # Немедленное обновление
}
if (-not $running) { break }
}
}
}
}
finally {
Write-Host (ShowCursor) -NoNewline
Write-Host (ClearScreen) -NoNewline
[Console]::TreatControlCAsInput = $false
Write-Host "$($COL.Orange)$(Bold)SEBERD MONITOR завершён.$($R)"
}
#endregion
[к сожалению готовый файл прикрепить не получилось]
Справка и навигация (1–10)
Get-Help— показывает справку по любой команде (например,Get-Help Get-Process).Get-Command— выводит список всех доступных команд в системе.Get-History— отображает историю введенных вами команд в текущей сессии.Invoke-History— запускает команду из истории по её идентификатору.Clear-History— очищает историю командной строки.Get-Location— показывает текущий путь в файловой системе (аналогpwd).Set-Location— переходит в указанную директорию (аналогcd).Push-Location— сохраняет текущий путь в стек и переходит в новый.Pop-Location— возвращается к пути, сохраненному черезPush-Location.Get-PSHostProcessInfo— показывает информацию о процессах, хостящих PowerShell.
Работа с файлами и папками (11–20)
Get-ChildItem— выводит список файлов и папок в директории (аналогlsилиdir).Copy-Item— копирует файлы или папки в другое место.Move-Item— перемещает или переименовывает файлы и папки.Remove-Item— удаляет файлы или папки (аналогdelилиrm).New-Item— создает новый файл, папку или другой элемент.Rename-Item— переименовывает файл или папку.Get-Content— читает содержимое текстового файла и выводит в консоль.Set-Content— записывает текст в файл, перезаписывая старое содержимое.Add-Content— дописывает текст в конец файла без перезаписи.Clear-Content— очищает содержимое файла, оставляя сам файл.
Управление процессами (21–30)
Get-Process— показывает список запущенных процессов (аналогpsили диспетчера задач).Stop-Process— завершает выбранный процесс по имени или ID.Start-Process— запускает новую программу или скрипт.Wait-Process— приостанавливает выполнение скрипта, пока процесс не завершится.Debug-Process— подключает отладчик к работающему процессу.Measure-Command— измеряет время выполнения команды или скрипта (для оценки производительности).Start-Transcript— начинает запись сессии PowerShell в текстовый лог-файл.Enter-PSHostProcess— подключается к другому процессу PowerShell для отладки.Exit-PSHostProcess— завершает подключение к другому процессу PowerShell.Get-Counter— собирает данные о производительности (CPU, RAM) в реальном времени.
Управление службами (31–40)
Get-Service— показывает статус всех системных служб (аналогservices.msc).Start-Service— запускает остановленную службу.Stop-Service— останавливает работающую службу.Restart-Service— перезапускает службу (останавливает и запускает снова).Set-Service— изменяет параметры службы (тип запуска, описание).Suspend-Service— приостанавливает работу службы (если поддерживается).Resume-Service— возобновляет работу приостановленной службы.New-Service— создает новую службу в системе.Get-CimInstance— универсальный командлет для получения данных через WMI/CIM (службы, железо, ОС и т.д.).Invoke-CimMethod— выполняет методы над объектами (например, старт службы через CIM).
Сеть и подключение (41–50)
Test-Connection— проверяет доступность узла по сети (аналогping).Test-NetConnection— расширенная проверка сети (порт, маршрут, пинг).Get-NetIPAddress— показывает все настроенные IP-адреса на интерфейсах.Set-NetIPAddress— изменяет настройки IP-адреса интерфейса.Get-NetRoute— отображает таблицу маршрутизации.New-NetRoute— добавляет новый статический маршрут.Remove-NetRoute— удаляет маршрут из таблицы.Get-NetAdapter— показывает список сетевых адаптеров и их статус.Disable-NetAdapter— отключает сетевой адаптер.Enable-NetAdapter— включает отключенный сетевой адаптер.
Пользователи и группы (локальные) (51–60)
Get-LocalUser— выводит список локальных пользователей компьютера.New-LocalUser— создает нового локального пользователя.Set-LocalUser— изменяет свойства пользователя (пароль, активация).Remove-LocalUser— удаляет локального пользователя.Get-LocalGroup— показывает список локальных групп.New-LocalGroup— создает новую локальную группу.Remove-LocalGroup— удаляет локальную группу.Add-LocalGroupMember— добавляет пользователя в локальную группу.Remove-LocalGroupMember— удаляет пользователя из локальной группы.Get-LocalGroupMember— показывает участников указанной локальной группы.
Журналы событий и система (61–70)
Get-EventLog— читает классические журналы событий Windows.Write-EventLog— записывает новую запись в журнал событий.Clear-EventLog— очищает содержимое журнала событий.Limit-EventLog— устанавливает ограничения на размер журнала.Show-EventLog— открывает просмотрщик событий (GUI).Get-WinEvent— работает с современными журналами событий (ETW).New-WinEvent— создает событие в современном журнале.Get-EventSubscriber— показывает активные подписки на события в текущей сессии.Get-ComputerInfo— выводит подробную сводку о системе (ОС, железо).Get-Date— показывает текущую дату и время.
Дата, время и локаль (71–80)
Set-Date— устанавливает системную дату и время.Get-TimeZone— показывает текущий часовой пояс.Set-TimeZone— изменяет часовой пояс системы.Get-Culture— показывает текущие региональные стандарты (язык, формат даты).Get-UICulture— показывает язык интерфейса системы.Get-ItemProperty— читает значения из реестра или свойства файла.Set-ItemProperty— изменяет значения в реестре или свойства файла.New-ItemProperty— создает новый параметр в реестре.Remove-ItemProperty— удаляет параметр из реестра.Copy-ItemProperty— копирует свойство из одного ключа реестра в другой.
Переменные и алиасы (81–90)
Get-Variable— показывает все созданные переменные в сессии.Set-Variable— создает или изменяет значение переменной.New-Variable— создает новую переменную (с дополнительными опциями).Remove-Variable— удаляет переменную из памяти.Clear-Variable— очищает значение переменной, не удаляя её.Get-Alias— показывает все алиасы (сокращения) команд.Set-Alias— создает или изменяет алиас для команды.New-Alias— создает новый алиас.Export-Alias— сохраняет список алиасов в файл.Import-Alias— загружает алиасы из файла.
Удаленное управление и данные (91–100)
Get-PSSession— показывает активные удаленные сессии.New-PSSession— создает новую постоянную удаленную сессию.Remove-PSSession— закрывает и удаляет удаленную сессию.Invoke-Command— выполняет команду на локальном или удаленном компьютере.Enter-PSSession— начинает интерактивную удаленную сессию.Exit-PSSession— завершает интерактивную удаленную сессию.ConvertTo-Json— преобразует объект в формат JSON.ConvertFrom-Json— преобразует JSON-строку в объект PowerShell.Export-Csv— сохраняет данные в файл формата CSV (таблица).Import-Csv— загружает данные из CSV-файла в виде объектов.
Работа с объектами и конвейером (101–110)
Get-Member— показывает свойства, методы и члены объекта (очень полезно для исследования вывода).Where-Object(алиас?) — фильтрует объекты по условию.ForEach-Object(алиас%) — выполняет действие для каждого объекта в конвейере.Select-Object— выбирает определённые свойства объектов или ограничивает количество.Sort-Object— сортирует объекты по свойствам.Group-Object— группирует объекты по общим значениям свойств.Measure-Object— подсчитывает количество, сумму, среднее и т.д.Compare-Object— сравнивает два набора объектов.Tee-Object— передаёт объекты дальше по конвейеру и одновременно сохраняет в файл/переменную.Out-Null— подавляет вывод (аналог >/dev/null).
Форматирование и вывод (111–120)
Format-Table— выводит данные в виде таблицы.Format-List— выводит данные в виде списка свойств.Format-Wide— выводит данные в широком формате (несколько колонок).Format-Custom— кастомное форматирование объектов.Out-File— записывает вывод в файл (аналог>).Out-GridView— выводит данные в интерактивной GUI-таблице (в PowerShell 7 на Windows).ConvertTo-Html— преобразует объекты в HTML-таблицу.ConvertTo-Xml— преобразует объекты в XML.Export-Clixml— сохраняет объекты в XML-файл (с сохранением типа).Import-Clixml— загружает объекты из CLIXML-файла.
Безопасность и права доступа (121–130)
Get-Acl— получает список контроля доступа (ACL) для файла, папки или реестра.Set-Acl— применяет ACL к объекту.Get-ExecutionPolicy— показывает текущую политику выполнения скриптов.Set-ExecutionPolicy— изменяет политику выполнения скриптов (осторожно!).Get-AuthenticodeSignature— проверяет цифровую подпись файла.Set-AuthenticodeSignature— подписывает скрипт цифровой подписью.Protect-CmsMessage/Unprotect-CmsMessage— шифрование/расшифровка сообщений (CMS).Get-Credential— запрашивает учётные данные (логин/пароль).ConvertTo-SecureString— преобразует обычный текст в SecureString.ConvertFrom-SecureString— обратное преобразование SecureString.
Дополнительная работа с файлами и реестром (131–140)
Get-Item— получает объект файла, папки или реестрового ключа.Invoke-Item— выполняет действие по умолчанию для элемента (открывает файл).Test-Path— проверяет существование пути (файл/папка/реестр).Join-Path— правильно объединяет части пути.Split-Path— разделяет путь на части (директория, имя файла и т.д.).Resolve-Path— разрешает относительные пути и wildcard.Get-Contentс-Tailи-Wait— чтение последних строк или мониторинг файла в реальном времени.Get-FileHash— вычисляет хэш файла (MD5, SHA256 и т.д.).Compress-Archive— создаёт ZIP-архив.Expand-Archive— распаковывает ZIP-архив.
Сеть и безопасность сети (141–150)
Resolve-DnsName— разрешает DNS-имя (аналогnslookup).Get-NetTCPConnection— показывает активные TCP-соединения (аналогnetstat).Get-NetUDPEndpoint— показывает UDP-порты.Get-NetFirewallRule— выводит правила Windows Firewall.New-NetFirewallRule— создаёт новое правило брандмауэра.Remove-NetFirewallRule— удаляет правило брандмауэра.Get-NetIPConfiguration— подробная информация о сетевой конфигурации.Find-NetRoute— находит маршрут к указанному адресу.Get-NetNeighbor— показывает ARP-таблицу (соседи по сети).Test-NetConnectionс параметром-Port— проверка открытости порта.
Управление модулями и обновлениями (151–160)
Get-Module— показывает загруженные модули.Import-Module— загружает модуль.Remove-Module— выгружает модуль.Find-Module— ищет модули в PowerShell Gallery.Install-Module— устанавливает модуль из галереи.Update-Module— обновляет установленный модуль.Uninstall-Module— удаляет модуль.Get-InstalledModule— список установленных модулей.Save-Module— скачивает модуль без установки.Get-PSRepository— показывает репозитории (включая PSGallery).
Полезные утилиты и скриптинг (161–170)
Start-Sleep— приостанавливает выполнение на указанное время.Get-Random— генерирует случайное число.Get-SecureRandom— безопасный генератор случайных чисел (PowerShell 7.4+).Get-Error— подробный вывод последнего (или всех) ошибок (PowerShell 7+).Set-PSReadLineOption— настраивает поведение PSReadLine (подсветка, история и т.д.).Get-HotFix— показывает установленные обновления Windows.Restart-Computer— перезагружает компьютер.Stop-Computer— выключает компьютер.Invoke-WebRequest— скачивает данные по HTTP/HTTPS (аналог curl).Invoke-RestMethod— работает с REST API (удобнее для JSON).
Работа с датой/временем и математикой (171–180)
New-TimeSpan— создаёт интервал времени.Add-Date/Subtract-Date(через методы DateTime) — добавляет/вычитает время.[math]::— статический класс для математических функций (Pi, Sin, Round и т.д.).Get-Date -UFormat— форматирование даты в Unix-стиле.Get-CimInstance Win32_OperatingSystem— информация об ОС через CIM.Get-CimInstance Win32_ComputerSystem— информация о компьютере.Get-CimInstance Win32_Processor— данные о процессоре.Get-CimInstance Win32_PhysicalMemory— информация о RAM.Get-WmiObject— устаревший, но всё ещё работающий аналог Get-CimInstance.Register-ObjectEvent— подписка на события .NET-объектов (например, на изменения файлов).

Примеры полезных однострочных скриптов и конструкций (181–200)
Здесь я добавляю не просто cmdlets, а часто используемые примеры и короткие конструкции, которые сильно упрощают жизнь.
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10— топ-10 процессов по CPU.Get-Service | Where-Object {$_.Status -eq 'Stopped'}— все остановленные службы.Get-ChildItem -Recurse -File | Where-Object Length -gt 1GB— файлы больше 1 ГБ.Get-Content file.log -Tail 50 -Wait— мониторинг лога в реальном времени.1..10 | ForEach-Object { "Item $_" }— простой цикл.Get-Process notepad | Stop-Process -Force— принудительно завершить процессы.Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace 'old','new' }— массовое переименование.Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Service }— выполнение на удалённом компьютере.$cred = Get-Credential; Enter-PSSession -ComputerName Server -Credential $cred— интерактивная сессия с учётными данными.Get-EventLog -LogName System -Newest 20 | Where-Object EntryType -eq Error— последние ошибки в системном логе.Get-Process | Export-Csv processes.csv -NoTypeInformation— экспорт в CSV.Import-Csv data.csv | ForEach-Object { New-LocalUser -Name $_.Name -Password (ConvertTo-SecureString $_.Pass -AsPlainText -Force) }— создание пользователей из CSV.Get-NetAdapter | Disable-NetAdapter -Confirm:$false— отключить все адаптеры (осторожно!).Get-Content script.ps1 | Set-Content script.ps1 -Encoding UTF8— исправление кодировки файла.Measure-Command { Get-ChildItem -Recurse }— замер времени выполнения.Start-Transcript -Path log.txt; ...; Stop-Transcript— запись всей сессии в лог.Get-ChildItem | Get-Member— исследование свойств файлов.Test-Connection google.com -Count 4 -Delay 1— пинг с задержкой.foreach ($item in Get-Process) { if ($item.CPU -gt 100) { $item } }— фильтрация без Where-Object.Get-Command -Module Microsoft.PowerShell.*— все команды из встроенных модулей PowerShell.
PowerShell 7.x специфические фичи (201–210)
ForEach-Object -Parallel— параллельное выполнение для каждого объекта (с-ThrottleLimitдля ограничения потоков). Отлично для массовых операций по сети.&&и||— цепные операторы конвейера (аналог bash: выполнить вторую команду только если первая успешна/неуспешна).??и??=— null-coalescing операторы (если значение null — взять альтернативу или присвоить).Get-Uptime— показывает время работы системы с последнего включения.ConvertTo-CliXml/ConvertFrom-CliXml— новые cmdlets в 7.5 для работы с CLIXML (сериализация объектов).Get-Errorс расширенными параметрами — подробный разбор последней ошибки (включая stack trace и категории).PSResourceGetмодуль (Find-PSResource,Install-PSResource,Update-PSResource) — современная заменаFind-Module/Install-Module(быстрее и надёжнее).Set-PSReadLineOption -PredictionSource— настройка предсказаний команд (AI-подсказки в консоли).Invoke-Command -Parallel(в некоторых модулях) или черезForEach-Object -Parallelдля удалённого выполнения.Ternary operator(condition ? trueValue : falseValue) — короткий условный оператор.
Безопасность и секреты (211–220)
Get-Secret/Set-Secret— работа с модулем Microsoft.PowerShell.SecretManagement (хранение паролей, ключей без хардкода).Register-SecretVault— регистрация хранилища секретов (KeePass, Azure Key Vault и др.).Protect-CmsMessageиUnprotect-CmsMessage— шифрование сообщений с помощью сертификатов.Get-ExecutionPolicy -List— подробный просмотр политик выполнения на разных уровнях (MachinePolicy, User и т.д.).Set-ExecutionPolicy -Scope Process— временное изменение политики только для текущей сессии.Get-AppLockerPolicy— просмотр политик AppLocker.New-AppLockerPolicy— создание правил AppLocker.Get-WindowsCapability/Add-WindowsCapability— управление дополнительными компонентами Windows (через DISM-подобные cmdlets).ConvertTo-SecureString -AsPlainText -Force+New-Object PSCredential— создание учётных данных.Test-Path -PathType Leaf/Container— точная проверка файла или папки.
Работа с облаком и модулями (221–230)
Connect-AzAccount— подключение к Azure (модуль Az).Get-AzVM/Start-AzVM/Stop-AzVM— управление виртуальными машинами Azure.Connect-MgGraph— подключение к Microsoft Graph (для M365, Entra ID).Get-MgUser/Get-MgGroup— работа с пользователями и группами Microsoft 365.Update-Moduleс-Force— принудительное обновление.Get-Module -ListAvailable— все доступные модули на системе.Import-Module -SkipEditionCheck— обход проверки edition для кросс-платформенных модулей.Save-Module -Path— скачивание модуля локально без установки.Get-PSCallStack— просмотр стека вызовов (полезно при отладке скриптов).Trace-Command— трассировка внутренних команд PowerShell (для глубокого анализа).
Полезные утилиты и производительность (231–240)
Measure-Commandс-Expression— точный замер времени.Start-Job/Receive-Job/Wait-Job— фоновые задания (background jobs).Get-Job— список запущенных заданий.Stop-Job— остановка задания.Get-Host— информация о текущем хосте PowerShell.Clear-Host(алиасcls) — очистка экрана.Get-Random -Maximum 100— генерация случайных чисел/элементов.Get-Date -Format "yyyy-MM-dd HH:mm:ss"— форматированная дата.New-Guid— генерация GUID.Get-ComputerInfo | Select-Object OsName, OsVersion, CsTotalPhysicalMemory— краткая сводка системы.
Продвинутые примеры скриптов и one-liners (241–260)
$servers | ForEach-Object -Parallel { Test-Connection $_ -Count 1 } -ThrottleLimit 20— параллельный пинг серверов.Get-ChildItem -Recurse -File | Sort-Object Length -Descending | Select-Object -First 10— топ-10 самых больших файлов.Get-Service | Where-Object Status -eq 'Running' | Select-Object Name, Status, StartType— запущенные службы с типом запуска.1..100 | ForEach-Object -Parallel { "Processing $_" }— простой параллельный цикл.Get-Process | Where-Object CPU -gt 50 | Stop-Process -Force— убить тяжёлые процессы.Get-EventLog -LogName Security -Newest 50 | Where-Object {$_.EventID -eq 4624}— последние успешные логины.Get-Content -Path log.txt -Tail 100 -Wait | ForEach-Object { if ($_ -match "ERROR") { $_ } }— мониторинг лога на ошибки.Get-NetTCPConnection | Where-Object State -eq Listen | Select-Object LocalPort, OwningProcess— слушающие порты.Invoke-WebRequest -Uri "https://api.example.com" -Method POST -Body (ConvertTo-Json $data)— работа с REST API.Get-ChildItem *.ps1 | ForEach-Object { . $_.FullName }— загрузка всех скриптов из папки.Compare-Object (Get-Content file1.txt) (Get-Content file2.txt)— сравнение двух файлов построчно.Get-LocalUser | Where-Object Enabled -eq $true | Select-Object Name, LastLogon— активные локальные пользователи.Restart-Computer -ComputerName RemotePC -Force -Wait— перезагрузка с ожиданием.Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-1)}— ошибки в системном журнале за сутки.Export-Csv+Import-Csvс-UseCulture— работа с региональными разделителями.Start-Process powershell -ArgumentList "-NoExit", "-Command", "Get-Process"— запуск PowerShell с командой.Get-Module -All | Update-Module— обновить все установленные модули.Remove-Item -Path "C:\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue— очистка папки без ошибок.if ($?) { "Success" } else { "Failed" }— проверка успеха последней команды.try { ... } catch { $_.Exception.Message } finally { ... }— полноценная обработка ошибок.
Ещё больше полезных one-liners и конструкций (261–300)
261–300. Я могу продолжить, но чтобы не перегружать, вот несколько особенно мощных:
- Массовое переименование:
Get-ChildItem *.jpg | Rename-Item -NewName { $_.BaseName + "_new" + $_.Extension } - Инвентаризация дисков:
Get-PhysicalDisk | Select-Object FriendlyName, Size, MediaType - Поиск файлов по содержимому:
Get-ChildItem -Recurse -File | Select-String "search_term" - Очистка старых файлов:
Get-ChildItem -Recurse | Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) | Remove-Item - Параллельная установка обновлений или проверка серверов с
ForEach-Object -Parallel. - Использование
Out-GridView -PassThruдля интерактивного выбора объектов.
Active Directory (301–330)
Модуль ActiveDirectory (устанавливается через RSAT на Windows или на контроллерах домена). Эти команды работают только в доменной среде.
Import-Module ActiveDirectory— загрузка модуля AD.Get-ADUser— получение информации об одном или нескольких пользователях (с-Filter,-SearchBase,-Properties *).New-ADUser— создание нового пользователя (с параметрами-Name,-SamAccountName,-UserPrincipalName,-AccountPassword,-Enabled $trueи др.).Set-ADUser— изменение свойств существующего пользователя (отдел, должность, email и т.д.).Remove-ADUser— удаление пользователя.Get-ADGroup— получение информации о группах.New-ADGroup— создание новой группы безопасности или рассылки.Add-ADGroupMember— добавление пользователя/группы в группу.Remove-ADGroupMember— удаление участника из группы.Get-ADGroupMember— список членов группы (с-Recursiveдля вложенных).Get-ADComputer— информация о компьютерах в домене.New-ADComputer— создание объекта компьютера.Get-ADOrganizationalUnit— работа с OU (организационными подразделениями).Get-ADDomain— информация о текущем домене.Get-ADForest— информация о лесе Active Directory.Get-ADObject— универсальный поиск любых объектов AD.Restore-ADObject— восстановление удалённого объекта из корзины AD.Unlock-ADAccount— разблокировка учётной записи.Disable-ADAccount/Enable-ADAccount— отключение/включение учётной записи.Set-ADAccountPassword— сброс пароля.Get-ADUser -Filter {Enabled -eq $false}— поиск отключённых пользователей.Get-ADUser -Filter * -SearchBase "OU=Users,DC=domain,DC=com"— пользователи в конкретном OU.Get-ADPrincipalGroupMembership— список групп, в которых состоит пользователь.Move-ADObject— перемещение объекта между OU.Rename-ADObject— переименование объекта AD.Get-ADReplicationPartnerMetadata— информация о репликации AD (для диагностики).Sync-ADObject— принудительная репликация объекта.Get-ADFineGrainedPasswordPolicy— просмотр тонких политик паролей.Get-ADUser -Properties * | Select-Object Name, LastLogonDate, PasswordLastSet— полезный отчёт по пользователям.Get-ADUser -Filter {LastLogonDate -lt (Get-Date).AddDays(-90)}— неактивные пользователи за 90 дней.
Лучшие практики скриптинга (331–360)
[CmdletBinding()]— превращает функцию в advanced function с поддержкой общих параметров (-Verbose,-Debug,-ErrorActionи т.д.).param()блок после[CmdletBinding()]— обязательный для advanced functions.Write-Verbose "Сообщение"— вывод подробной информации (видно только с-Verbose).Write-Debug "Сообщение"— отладочные сообщения (видно с-Debug).SupportsShouldProcess=$trueв[CmdletBinding()]— добавляет поддержку-WhatIfи-Confirm.$PSCmdlet.ShouldProcess("Target", "Action")— проверка перед опасными действиями.Write-Progress— индикатор прогресса для длительных операций.[Parameter(Mandatory=$true)]— обязательный параметр функции.[ValidateNotNullOrEmpty()],[ValidateRange(1,100)],[ValidateSet("Value1","Value2")]— валидация параметров.try { } catch { } finally { }— полноценная обработка ошибок.Write-Error/Throw— генерация ошибок.ErrorAction Stop— превращение некритических ошибок в останавливающие.- Комментарий-based help:
.SYNOPSIS,.DESCRIPTION,.EXAMPLE,.PARAMETER— встроенная справка (Get-Help). - Семантическое версионирование скриптов/модулей (например, 1.2.3).
- Хранение скриптов в модулях (.psm1 + .psd1) вместо отдельных .ps1.
- Использование
Export-ModuleMemberдля контроля экспортируемых функций. - Логирование:
Start-Transcript/Stop-Transcriptили собственный лог-файл сAdd-Content. - Избегать
Write-Hostв продакшен-скриптах — лучшеWrite-OutputилиWrite-Verbose. - Использовать
ShouldProcessдля всех действий, изменяющих систему. - Тестирование скриптов в разных окружениях (PowerShell 5.1 и 7+).
PSCustomObjectвместоNew-Object PSObjectдля создания объектов.- Конвейерный стиль: избегать ненужных переменных, где можно использовать
%и?. [CmdletBinding(SupportsPaging=$true)]— поддержка пагинации в больших результатах.- Использование
PSResourceGetвместо старогоPowerShellGetдля модулей. - Хранение секретов через
Microsoft.PowerShell.SecretManagement. - Версионирование модулей и использование
RequiredVersionв манифесте. Begin {} Process {} End {}— блоки в advanced functions для правильной работы с конвейером.DynamicParam {}— динамические параметры (сложно, но мощно).Pester— модуль для unit-тестирования скриптов (тесты пишутся на PowerShell).Invoke-ScriptAnalyzer(PSScriptAnalyzer) — статический анализ кода на лучшие практики и ошибки.

PowerShell знает о вашей системе больше, чем вы думаете. Он помнит каждый процесс, каждое событие в журнале, каждое изменение файла — нужно только спросить правильно. Чем дольше вы с ним работаете, тем реже тянетесь к мыши. А потом наступает момент, когда задача, на которую раньше уходил час кликов, решается за сорок секунд и одну строку кода. Именно ради этого момента стоит учить PowerShell всерьёз.
Отладка (361–380)
Set-PSDebug -Trace 1— трассировка каждой строки скрипта.Set-PSDebug -Trace 2— расширенная трассировка (включая вызовы функций и присвоения переменных).Set-PSDebug -Step— пошаговое выполнение с подтверждением каждой строки.Set-PSDebug -Strict— строгий режим (ошибка при обращении к несуществующим переменным).Set-PSDebug -Off— отключение отладки.Set-PSBreakpoint -Script script.ps1 -Line 42— установка точки останова по строке.Set-PSBreakpoint -Command "Get-Process"— breakpoint по команде.Set-PSBreakpoint -Variable myVar -Mode Write— breakpoint при изменении переменной.Get-PSBreakpoint/Remove-PSBreakpoint— управление точками останова.Debug-Job— отладка фонового задания (Start-Job).Wait-Debugger— приостановка выполнения до подключения отладчика.Get-Error— подробный разбор последней ошибки (PowerShell 7+).$Error[0]— просмотр последней ошибки.Trace-Command— трассировка внутренних компонентов PowerShell.Enter-PSSession+ отладка внутри сессии.Debug-Process— подключение отладчика к процессу.Get-PSCallStack— просмотр стека вызовов во время отладки.StepInto,StepOver,StepOut,Continue— команды отладчика (s, v, o, c).Write-Debugс$DebugPreference = 'Continue'.- Использование VS Code с расширением PowerShell для графической отладки.
400 команд — это не потолок, это фундамент. PowerShell развивается: каждая версия добавляет новые возможности, модули расширяют его в стороны Azure, Microsoft 365, Kubernetes и дальше. Лучший способ освоить всё это — не читать справочники от начала до конца, а решать реальные задачи. Сломайте что-нибудь в тестовой среде. Починьте это скриптом. Запустите на ста машинах параллельно. Повторите.
Кросс-платформенность (PowerShell 7+ на Linux/macOS) (381–400)
pwsh— запуск PowerShell 7+ (вместоpowershell.exe).Get-OperatingSystemили$IsLinux,$IsMacOS,$IsWindows— проверка платформы.Get-ChildItem— работает одинаково, но пути:/на Linux/macOS,\на Windows (лучшеJoin-Path).Test-Path,New-Item,Remove-Item— кросс-платформенные.Invoke-WebRequest/Invoke-RestMethod— одинаково на всех платформах.ConvertTo-Json/ConvertFrom-Json— полностью кросс-платформенные.Compress-Archive/Expand-Archive— работают на Linux/macOS.Get-Process— показывает процессы, но свойства могут отличаться.Start-Process— поведение отличается (на Linux/macOS используетdotnetили shell).Get-Service/Start-Service— не работают на Linux/macOS (только Windows).Get-CimInstance/ WMI — в основном Windows-only.Get-NetAdapter,Get-NetIPAddress— сетевые cmdlets частично доступны через совместимые модули.~/.config/powershell/Microsoft.PowerShell_profile.ps1— профиль на Linux/macOS.PSReadLine— работает везде, но настройки клавиш могут отличаться.ForEach-Object -Parallel— отлично работает на всех платформах.- Избегать
Get-WmiObject— используйGet-CimInstanceгде возможно (но CIM тоже ограничен). dotnetкоманды и модули на .NET — полностью кросс-платформенные.sshиNew-PSSession -SSHConnection— удалённое управление Linux-хостами из PowerShell.uname,hostnamectlчерезInvoke-Expressionили&для Linux-специфичных команд.- Тестирование скриптов: используй conditional logic (
if ($IsLinux) { ... }).
Где-то прямо сейчас системный администратор в три часа ночи смотрит на красный алерт и думает: «Хорошо, что я помню эту команду». А рядом с ним — тот, кто не помнит, но знает, где искать. Разница между ними не в памяти — в привычке держать справочник под рукой и не бояться конвейера. Удачи на дежурстве.