Справочник команд PowerShell для автоматизации и администрирования

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)

  1. Get-Help — показывает справку по любой команде (например, Get-Help Get-Process).
  2. Get-Command — выводит список всех доступных команд в системе.
  3. Get-History — отображает историю введенных вами команд в текущей сессии.
  4. Invoke-History — запускает команду из истории по её идентификатору.
  5. Clear-History — очищает историю командной строки.
  6. Get-Location — показывает текущий путь в файловой системе (аналог pwd).
  7. Set-Location — переходит в указанную директорию (аналог cd).
  8. Push-Location — сохраняет текущий путь в стек и переходит в новый.
  9. Pop-Location — возвращается к пути, сохраненному через Push-Location.
  10. Get-PSHostProcessInfo — показывает информацию о процессах, хостящих PowerShell.

Работа с файлами и папками (11–20)

  1. Get-ChildItem — выводит список файлов и папок в директории (аналог ls или dir).
  2. Copy-Item — копирует файлы или папки в другое место.
  3. Move-Item — перемещает или переименовывает файлы и папки.
  4. Remove-Item — удаляет файлы или папки (аналог del или rm).
  5. New-Item — создает новый файл, папку или другой элемент.
  6. Rename-Item — переименовывает файл или папку.
  7. Get-Content — читает содержимое текстового файла и выводит в консоль.
  8. Set-Content — записывает текст в файл, перезаписывая старое содержимое.
  9. Add-Content — дописывает текст в конец файла без перезаписи.
  10. Clear-Content — очищает содержимое файла, оставляя сам файл.

Управление процессами (21–30)

  1. Get-Process — показывает список запущенных процессов (аналог ps или диспетчера задач).
  2. Stop-Process — завершает выбранный процесс по имени или ID.
  3. Start-Process — запускает новую программу или скрипт.
  4. Wait-Process — приостанавливает выполнение скрипта, пока процесс не завершится.
  5. Debug-Process — подключает отладчик к работающему процессу.
  6. Measure-Command — измеряет время выполнения команды или скрипта (для оценки производительности).
  7. Start-Transcript — начинает запись сессии PowerShell в текстовый лог-файл.
  8. Enter-PSHostProcess — подключается к другому процессу PowerShell для отладки.
  9. Exit-PSHostProcess — завершает подключение к другому процессу PowerShell.
  10. Get-Counter — собирает данные о производительности (CPU, RAM) в реальном времени.

Управление службами (31–40)

  1. Get-Service — показывает статус всех системных служб (аналог services.msc).
  2. Start-Service — запускает остановленную службу.
  3. Stop-Service — останавливает работающую службу.
  4. Restart-Service — перезапускает службу (останавливает и запускает снова).
  5. Set-Service — изменяет параметры службы (тип запуска, описание).
  6. Suspend-Service — приостанавливает работу службы (если поддерживается).
  7. Resume-Service — возобновляет работу приостановленной службы.
  8. New-Service — создает новую службу в системе.
  9. Get-CimInstance — универсальный командлет для получения данных через WMI/CIM (службы, железо, ОС и т.д.).
  10. Invoke-CimMethod — выполняет методы над объектами (например, старт службы через CIM).

Сеть и подключение (41–50)

  1. Test-Connection — проверяет доступность узла по сети (аналог ping).
  2. Test-NetConnection — расширенная проверка сети (порт, маршрут, пинг).
  3. Get-NetIPAddress — показывает все настроенные IP-адреса на интерфейсах.
  4. Set-NetIPAddress — изменяет настройки IP-адреса интерфейса.
  5. Get-NetRoute — отображает таблицу маршрутизации.
  6. New-NetRoute — добавляет новый статический маршрут.
  7. Remove-NetRoute — удаляет маршрут из таблицы.
  8. Get-NetAdapter — показывает список сетевых адаптеров и их статус.
  9. Disable-NetAdapter — отключает сетевой адаптер.
  10. Enable-NetAdapter — включает отключенный сетевой адаптер.

Пользователи и группы (локальные) (51–60)

  1. Get-LocalUser — выводит список локальных пользователей компьютера.
  2. New-LocalUser — создает нового локального пользователя.
  3. Set-LocalUser — изменяет свойства пользователя (пароль, активация).
  4. Remove-LocalUser — удаляет локального пользователя.
  5. Get-LocalGroup — показывает список локальных групп.
  6. New-LocalGroup — создает новую локальную группу.
  7. Remove-LocalGroup — удаляет локальную группу.
  8. Add-LocalGroupMember — добавляет пользователя в локальную группу.
  9. Remove-LocalGroupMember — удаляет пользователя из локальной группы.
  10. Get-LocalGroupMember — показывает участников указанной локальной группы.

Журналы событий и система (61–70)

  1. Get-EventLog — читает классические журналы событий Windows.
  2. Write-EventLog — записывает новую запись в журнал событий.
  3. Clear-EventLog — очищает содержимое журнала событий.
  4. Limit-EventLog — устанавливает ограничения на размер журнала.
  5. Show-EventLog — открывает просмотрщик событий (GUI).
  6. Get-WinEvent — работает с современными журналами событий (ETW).
  7. New-WinEvent — создает событие в современном журнале.
  8. Get-EventSubscriber — показывает активные подписки на события в текущей сессии.
  9. Get-ComputerInfo — выводит подробную сводку о системе (ОС, железо).
  10. Get-Date — показывает текущую дату и время.

Дата, время и локаль (71–80)

  1. Set-Date — устанавливает системную дату и время.
  2. Get-TimeZone — показывает текущий часовой пояс.
  3. Set-TimeZone — изменяет часовой пояс системы.
  4. Get-Culture — показывает текущие региональные стандарты (язык, формат даты).
  5. Get-UICulture — показывает язык интерфейса системы.
  6. Get-ItemProperty — читает значения из реестра или свойства файла.
  7. Set-ItemProperty — изменяет значения в реестре или свойства файла.
  8. New-ItemProperty — создает новый параметр в реестре.
  9. Remove-ItemProperty — удаляет параметр из реестра.
  10. Copy-ItemProperty — копирует свойство из одного ключа реестра в другой.

Переменные и алиасы (81–90)

  1. Get-Variable — показывает все созданные переменные в сессии.
  2. Set-Variable — создает или изменяет значение переменной.
  3. New-Variable — создает новую переменную (с дополнительными опциями).
  4. Remove-Variable — удаляет переменную из памяти.
  5. Clear-Variable — очищает значение переменной, не удаляя её.
  6. Get-Alias — показывает все алиасы (сокращения) команд.
  7. Set-Alias — создает или изменяет алиас для команды.
  8. New-Alias — создает новый алиас.
  9. Export-Alias — сохраняет список алиасов в файл.
  10. Import-Alias — загружает алиасы из файла.

Удаленное управление и данные (91–100)

  1. Get-PSSession — показывает активные удаленные сессии.
  2. New-PSSession — создает новую постоянную удаленную сессию.
  3. Remove-PSSession — закрывает и удаляет удаленную сессию.
  4. Invoke-Command — выполняет команду на локальном или удаленном компьютере.
  5. Enter-PSSession — начинает интерактивную удаленную сессию.
  6. Exit-PSSession — завершает интерактивную удаленную сессию.
  7. ConvertTo-Json — преобразует объект в формат JSON.
  8. ConvertFrom-Json — преобразует JSON-строку в объект PowerShell.
  9. Export-Csv — сохраняет данные в файл формата CSV (таблица).
  10. Import-Csv — загружает данные из CSV-файла в виде объектов.

Работа с объектами и конвейером (101–110)

  1. Get-Member — показывает свойства, методы и члены объекта (очень полезно для исследования вывода).
  2. Where-Object (алиас ?) — фильтрует объекты по условию.
  3. ForEach-Object (алиас %) — выполняет действие для каждого объекта в конвейере.
  4. Select-Object — выбирает определённые свойства объектов или ограничивает количество.
  5. Sort-Object — сортирует объекты по свойствам.
  6. Group-Object — группирует объекты по общим значениям свойств.
  7. Measure-Object — подсчитывает количество, сумму, среднее и т.д.
  8. Compare-Object — сравнивает два набора объектов.
  9. Tee-Object — передаёт объекты дальше по конвейеру и одновременно сохраняет в файл/переменную.
  10. Out-Null — подавляет вывод (аналог >/dev/null).

Форматирование и вывод (111–120)

  1. Format-Table — выводит данные в виде таблицы.
  2. Format-List — выводит данные в виде списка свойств.
  3. Format-Wide — выводит данные в широком формате (несколько колонок).
  4. Format-Custom — кастомное форматирование объектов.
  5. Out-File — записывает вывод в файл (аналог >).
  6. Out-GridView — выводит данные в интерактивной GUI-таблице (в PowerShell 7 на Windows).
  7. ConvertTo-Html — преобразует объекты в HTML-таблицу.
  8. ConvertTo-Xml — преобразует объекты в XML.
  9. Export-Clixml — сохраняет объекты в XML-файл (с сохранением типа).
  10. Import-Clixml — загружает объекты из CLIXML-файла.

Безопасность и права доступа (121–130)

  1. Get-Acl — получает список контроля доступа (ACL) для файла, папки или реестра.
  2. Set-Acl — применяет ACL к объекту.
  3. Get-ExecutionPolicy — показывает текущую политику выполнения скриптов.
  4. Set-ExecutionPolicy — изменяет политику выполнения скриптов (осторожно!).
  5. Get-AuthenticodeSignature — проверяет цифровую подпись файла.
  6. Set-AuthenticodeSignature — подписывает скрипт цифровой подписью.
  7. Protect-CmsMessage / Unprotect-CmsMessage — шифрование/расшифровка сообщений (CMS).
  8. Get-Credential — запрашивает учётные данные (логин/пароль).
  9. ConvertTo-SecureString — преобразует обычный текст в SecureString.
  10. ConvertFrom-SecureString — обратное преобразование SecureString.

Дополнительная работа с файлами и реестром (131–140)

  1. Get-Item — получает объект файла, папки или реестрового ключа.
  2. Invoke-Item — выполняет действие по умолчанию для элемента (открывает файл).
  3. Test-Path — проверяет существование пути (файл/папка/реестр).
  4. Join-Path — правильно объединяет части пути.
  5. Split-Path — разделяет путь на части (директория, имя файла и т.д.).
  6. Resolve-Path — разрешает относительные пути и wildcard.
  7. Get-Content с -Tail и -Wait — чтение последних строк или мониторинг файла в реальном времени.
  8. Get-FileHash — вычисляет хэш файла (MD5, SHA256 и т.д.).
  9. Compress-Archive — создаёт ZIP-архив.
  10. Expand-Archive — распаковывает ZIP-архив.

Сеть и безопасность сети (141–150)

  1. Resolve-DnsName — разрешает DNS-имя (аналог nslookup).
  2. Get-NetTCPConnection — показывает активные TCP-соединения (аналог netstat).
  3. Get-NetUDPEndpoint — показывает UDP-порты.
  4. Get-NetFirewallRule — выводит правила Windows Firewall.
  5. New-NetFirewallRule — создаёт новое правило брандмауэра.
  6. Remove-NetFirewallRule — удаляет правило брандмауэра.
  7. Get-NetIPConfiguration — подробная информация о сетевой конфигурации.
  8. Find-NetRoute — находит маршрут к указанному адресу.
  9. Get-NetNeighbor — показывает ARP-таблицу (соседи по сети).
  10. Test-NetConnection с параметром -Port — проверка открытости порта.

Управление модулями и обновлениями (151–160)

  1. Get-Module — показывает загруженные модули.
  2. Import-Module — загружает модуль.
  3. Remove-Module — выгружает модуль.
  4. Find-Module — ищет модули в PowerShell Gallery.
  5. Install-Module — устанавливает модуль из галереи.
  6. Update-Module — обновляет установленный модуль.
  7. Uninstall-Module — удаляет модуль.
  8. Get-InstalledModule — список установленных модулей.
  9. Save-Module — скачивает модуль без установки.
  10. Get-PSRepository — показывает репозитории (включая PSGallery).

Полезные утилиты и скриптинг (161–170)

  1. Start-Sleep — приостанавливает выполнение на указанное время.
  2. Get-Random — генерирует случайное число.
  3. Get-SecureRandom — безопасный генератор случайных чисел (PowerShell 7.4+).
  4. Get-Error — подробный вывод последнего (или всех) ошибок (PowerShell 7+).
  5. Set-PSReadLineOption — настраивает поведение PSReadLine (подсветка, история и т.д.).
  6. Get-HotFix — показывает установленные обновления Windows.
  7. Restart-Computer — перезагружает компьютер.
  8. Stop-Computer — выключает компьютер.
  9. Invoke-WebRequest — скачивает данные по HTTP/HTTPS (аналог curl).
  10. Invoke-RestMethod — работает с REST API (удобнее для JSON).

Работа с датой/временем и математикой (171–180)

  1. New-TimeSpan — создаёт интервал времени.
  2. Add-Date / Subtract-Date (через методы DateTime) — добавляет/вычитает время.
  3. [math]:: — статический класс для математических функций (Pi, Sin, Round и т.д.).
  4. Get-Date -UFormat — форматирование даты в Unix-стиле.
  5. Get-CimInstance Win32_OperatingSystemинформация об ОС через CIM.
  6. Get-CimInstance Win32_ComputerSystemинформация о компьютере.
  7. Get-CimInstance Win32_Processor — данные о процессоре.
  8. Get-CimInstance Win32_PhysicalMemoryинформация о RAM.
  9. Get-WmiObject — устаревший, но всё ещё работающий аналог Get-CimInstance.
  10. Register-ObjectEvent — подписка на события .NET-объектов (например, на изменения файлов).

Примеры полезных однострочных скриптов и конструкций (181–200)

Здесь я добавляю не просто cmdlets, а часто используемые примеры и короткие конструкции, которые сильно упрощают жизнь.

  1. Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 — топ-10 процессов по CPU.
  2. Get-Service | Where-Object {$_.Status -eq 'Stopped'} — все остановленные службы.
  3. Get-ChildItem -Recurse -File | Where-Object Length -gt 1GB — файлы больше 1 ГБ.
  4. Get-Content file.log -Tail 50 -Wait — мониторинг лога в реальном времени.
  5. 1..10 | ForEach-Object { "Item $_" } — простой цикл.
  6. Get-Process notepad | Stop-Process -Force — принудительно завершить процессы.
  7. Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace 'old','new' } — массовое переименование.
  8. Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Service } — выполнение на удалённом компьютере.
  9. $cred = Get-Credential; Enter-PSSession -ComputerName Server -Credential $cred — интерактивная сессия с учётными данными.
  10. Get-EventLog -LogName System -Newest 20 | Where-Object EntryType -eq Error — последние ошибки в системном логе.
  11. Get-Process | Export-Csv processes.csv -NoTypeInformation — экспорт в CSV.
  12. Import-Csv data.csv | ForEach-Object { New-LocalUser -Name $_.Name -Password (ConvertTo-SecureString $_.Pass -AsPlainText -Force) } — создание пользователей из CSV.
  13. Get-NetAdapter | Disable-NetAdapter -Confirm:$false — отключить все адаптеры (осторожно!).
  14. Get-Content script.ps1 | Set-Content script.ps1 -Encoding UTF8 — исправление кодировки файла.
  15. Measure-Command { Get-ChildItem -Recurse } — замер времени выполнения.
  16. Start-Transcript -Path log.txt; ...; Stop-Transcript — запись всей сессии в лог.
  17. Get-ChildItem | Get-Member — исследование свойств файлов.
  18. Test-Connection google.com -Count 4 -Delay 1 — пинг с задержкой.
  19. foreach ($item in Get-Process) { if ($item.CPU -gt 100) { $item } } — фильтрация без Where-Object.
  20. Get-Command -Module Microsoft.PowerShell.* — все команды из встроенных модулей PowerShell.

PowerShell 7.x специфические фичи (201–210)

  1. ForEach-Object -Parallel — параллельное выполнение для каждого объекта (с -ThrottleLimit для ограничения потоков). Отлично для массовых операций по сети.
  2. && и || — цепные операторы конвейера (аналог bash: выполнить вторую команду только если первая успешна/неуспешна).
  3. ?? и ??= — null-coalescing операторы (если значение null — взять альтернативу или присвоить).
  4. Get-Uptime — показывает время работы системы с последнего включения.
  5. ConvertTo-CliXml / ConvertFrom-CliXml — новые cmdlets в 7.5 для работы с CLIXML (сериализация объектов).
  6. Get-Error с расширенными параметрами — подробный разбор последней ошибки (включая stack trace и категории).
  7. PSResourceGet модуль (Find-PSResource, Install-PSResource, Update-PSResource) — современная замена Find-Module / Install-Module (быстрее и надёжнее).
  8. Set-PSReadLineOption -PredictionSource — настройка предсказаний команд (AI-подсказки в консоли).
  9. Invoke-Command -Parallel (в некоторых модулях) или через ForEach-Object -Parallel для удалённого выполнения.
  10. Ternary operator (condition ? trueValue : falseValue) — короткий условный оператор.

Безопасность и секреты (211–220)

  1. Get-Secret / Set-Secret — работа с модулем Microsoft.PowerShell.SecretManagement (хранение паролей, ключей без хардкода).
  2. Register-SecretVault — регистрация хранилища секретов (KeePass, Azure Key Vault и др.).
  3. Protect-CmsMessage и Unprotect-CmsMessage — шифрование сообщений с помощью сертификатов.
  4. Get-ExecutionPolicy -List — подробный просмотр политик выполнения на разных уровнях (MachinePolicy, User и т.д.).
  5. Set-ExecutionPolicy -Scope Process — временное изменение политики только для текущей сессии.
  6. Get-AppLockerPolicy — просмотр политик AppLocker.
  7. New-AppLockerPolicy — создание правил AppLocker.
  8. Get-WindowsCapability / Add-WindowsCapability — управление дополнительными компонентами Windows (через DISM-подобные cmdlets).
  9. ConvertTo-SecureString -AsPlainText -Force + New-Object PSCredential — создание учётных данных.
  10. Test-Path -PathType Leaf / Container — точная проверка файла или папки.

Работа с облаком и модулями (221–230)

  1. Connect-AzAccount — подключение к Azure (модуль Az).
  2. Get-AzVM / Start-AzVM / Stop-AzVM — управление виртуальными машинами Azure.
  3. Connect-MgGraph — подключение к Microsoft Graph (для M365, Entra ID).
  4. Get-MgUser / Get-MgGroup — работа с пользователями и группами Microsoft 365.
  5. Update-Module с -Force — принудительное обновление.
  6. Get-Module -ListAvailable — все доступные модули на системе.
  7. Import-Module -SkipEditionCheck — обход проверки edition для кросс-платформенных модулей.
  8. Save-Module -Path — скачивание модуля локально без установки.
  9. Get-PSCallStack — просмотр стека вызовов (полезно при отладке скриптов).
  10. Trace-Command — трассировка внутренних команд PowerShell (для глубокого анализа).

Полезные утилиты и производительность (231–240)

  1. Measure-Command с -Expression — точный замер времени.
  2. Start-Job / Receive-Job / Wait-Job — фоновые задания (background jobs).
  3. Get-Job — список запущенных заданий.
  4. Stop-Job — остановка задания.
  5. Get-Hostинформация о текущем хосте PowerShell.
  6. Clear-Host (алиас cls) — очистка экрана.
  7. Get-Random -Maximum 100 — генерация случайных чисел/элементов.
  8. Get-Date -Format "yyyy-MM-dd HH:mm:ss" — форматированная дата.
  9. New-Guid — генерация GUID.
  10. Get-ComputerInfo | Select-Object OsName, OsVersion, CsTotalPhysicalMemory — краткая сводка системы.

Продвинутые примеры скриптов и one-liners (241–260)

  1. $servers | ForEach-Object -Parallel { Test-Connection $_ -Count 1 } -ThrottleLimit 20 — параллельный пинг серверов.
  2. Get-ChildItem -Recurse -File | Sort-Object Length -Descending | Select-Object -First 10 — топ-10 самых больших файлов.
  3. Get-Service | Where-Object Status -eq 'Running' | Select-Object Name, Status, StartType — запущенные службы с типом запуска.
  4. 1..100 | ForEach-Object -Parallel { "Processing $_" } — простой параллельный цикл.
  5. Get-Process | Where-Object CPU -gt 50 | Stop-Process -Force — убить тяжёлые процессы.
  6. Get-EventLog -LogName Security -Newest 50 | Where-Object {$_.EventID -eq 4624} — последние успешные логины.
  7. Get-Content -Path log.txt -Tail 100 -Wait | ForEach-Object { if ($_ -match "ERROR") { $_ } } — мониторинг лога на ошибки.
  8. Get-NetTCPConnection | Where-Object State -eq Listen | Select-Object LocalPort, OwningProcess — слушающие порты.
  9. Invoke-WebRequest -Uri "https://api.example.com" -Method POST -Body (ConvertTo-Json $data) — работа с REST API.
  10. Get-ChildItem *.ps1 | ForEach-Object { . $_.FullName } — загрузка всех скриптов из папки.
  11. Compare-Object (Get-Content file1.txt) (Get-Content file2.txt) — сравнение двух файлов построчно.
  12. Get-LocalUser | Where-Object Enabled -eq $true | Select-Object Name, LastLogon — активные локальные пользователи.
  13. Restart-Computer -ComputerName RemotePC -Force -Wait — перезагрузка с ожиданием.
  14. Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-1)} — ошибки в системном журнале за сутки.
  15. Export-Csv + Import-Csv с -UseCulture — работа с региональными разделителями.
  16. Start-Process powershell -ArgumentList "-NoExit", "-Command", "Get-Process" — запуск PowerShell с командой.
  17. Get-Module -All | Update-Module — обновить все установленные модули.
  18. Remove-Item -Path "C:\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue — очистка папки без ошибок.
  19. if ($?) { "Success" } else { "Failed" } — проверка успеха последней команды.
  20. 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 или на контроллерах домена). Эти команды работают только в доменной среде.

  1. Import-Module ActiveDirectory — загрузка модуля AD.
  2. Get-ADUser — получение информации об одном или нескольких пользователях (с -Filter, -SearchBase, -Properties *).
  3. New-ADUser — создание нового пользователя (с параметрами -Name, -SamAccountName, -UserPrincipalName, -AccountPassword, -Enabled $true и др.).
  4. Set-ADUser — изменение свойств существующего пользователя (отдел, должность, email и т.д.).
  5. Remove-ADUser — удаление пользователя.
  6. Get-ADGroup — получение информации о группах.
  7. New-ADGroup — создание новой группы безопасности или рассылки.
  8. Add-ADGroupMember — добавление пользователя/группы в группу.
  9. Remove-ADGroupMember — удаление участника из группы.
  10. Get-ADGroupMember — список членов группы (с -Recursive для вложенных).
  11. Get-ADComputerинформация о компьютерах в домене.
  12. New-ADComputer — создание объекта компьютера.
  13. Get-ADOrganizationalUnit — работа с OU (организационными подразделениями).
  14. Get-ADDomainинформация о текущем домене.
  15. Get-ADForestинформация о лесе Active Directory.
  16. Get-ADObject — универсальный поиск любых объектов AD.
  17. Restore-ADObject — восстановление удалённого объекта из корзины AD.
  18. Unlock-ADAccount — разблокировка учётной записи.
  19. Disable-ADAccount / Enable-ADAccount — отключение/включение учётной записи.
  20. Set-ADAccountPassword — сброс пароля.
  21. Get-ADUser -Filter {Enabled -eq $false} — поиск отключённых пользователей.
  22. Get-ADUser -Filter * -SearchBase "OU=Users,DC=domain,DC=com" — пользователи в конкретном OU.
  23. Get-ADPrincipalGroupMembership — список групп, в которых состоит пользователь.
  24. Move-ADObject — перемещение объекта между OU.
  25. Rename-ADObject — переименование объекта AD.
  26. Get-ADReplicationPartnerMetadataинформация о репликации AD (для диагностики).
  27. Sync-ADObject — принудительная репликация объекта.
  28. Get-ADFineGrainedPasswordPolicy — просмотр тонких политик паролей.
  29. Get-ADUser -Properties * | Select-Object Name, LastLogonDate, PasswordLastSet — полезный отчёт по пользователям.
  30. Get-ADUser -Filter {LastLogonDate -lt (Get-Date).AddDays(-90)} — неактивные пользователи за 90 дней.

Лучшие практики скриптинга (331–360)

  1. [CmdletBinding()] — превращает функцию в advanced function с поддержкой общих параметров (-Verbose, -Debug, -ErrorAction и т.д.).
  2. param() блок после [CmdletBinding()] — обязательный для advanced functions.
  3. Write-Verbose "Сообщение" — вывод подробной информации (видно только с -Verbose).
  4. Write-Debug "Сообщение" — отладочные сообщения (видно с -Debug).
  5. SupportsShouldProcess=$true в [CmdletBinding()] — добавляет поддержку -WhatIf и -Confirm.
  6. $PSCmdlet.ShouldProcess("Target", "Action") — проверка перед опасными действиями.
  7. Write-Progress — индикатор прогресса для длительных операций.
  8. [Parameter(Mandatory=$true)] — обязательный параметр функции.
  9. [ValidateNotNullOrEmpty()], [ValidateRange(1,100)], [ValidateSet("Value1","Value2")] — валидация параметров.
  10. try { } catch { } finally { } — полноценная обработка ошибок.
  11. Write-Error / Throw — генерация ошибок.
  12. ErrorAction Stop — превращение некритических ошибок в останавливающие.
  13. Комментарий-based help: .SYNOPSIS, .DESCRIPTION, .EXAMPLE, .PARAMETER — встроенная справка (Get-Help).
  14. Семантическое версионирование скриптов/модулей (например, 1.2.3).
  15. Хранение скриптов в модулях (.psm1 + .psd1) вместо отдельных .ps1.
  16. Использование Export-ModuleMember для контроля экспортируемых функций.
  17. Логирование: Start-Transcript / Stop-Transcript или собственный лог-файл с Add-Content.
  18. Избегать Write-Host в продакшен-скриптах — лучше Write-Output или Write-Verbose.
  19. Использовать ShouldProcess для всех действий, изменяющих систему.
  20. Тестирование скриптов в разных окружениях (PowerShell 5.1 и 7+).
  21. PSCustomObject вместо New-Object PSObject для создания объектов.
  22. Конвейерный стиль: избегать ненужных переменных, где можно использовать % и ?.
  23. [CmdletBinding(SupportsPaging=$true)] — поддержка пагинации в больших результатах.
  24. Использование PSResourceGet вместо старого PowerShellGet для модулей.
  25. Хранение секретов через Microsoft.PowerShell.SecretManagement.
  26. Версионирование модулей и использование RequiredVersion в манифесте.
  27. Begin {} Process {} End {} — блоки в advanced functions для правильной работы с конвейером.
  28. DynamicParam {} — динамические параметры (сложно, но мощно).
  29. Pester — модуль для unit-тестирования скриптов (тесты пишутся на PowerShell).
  30. Invoke-ScriptAnalyzer (PSScriptAnalyzer) — статический анализ кода на лучшие практики и ошибки.

PowerShell знает о вашей системе больше, чем вы думаете. Он помнит каждый процесс, каждое событие в журнале, каждое изменение файла — нужно только спросить правильно. Чем дольше вы с ним работаете, тем реже тянетесь к мыши. А потом наступает момент, когда задача, на которую раньше уходил час кликов, решается за сорок секунд и одну строку кода. Именно ради этого момента стоит учить PowerShell всерьёз.

Отладка (361–380)

  1. Set-PSDebug -Trace 1 — трассировка каждой строки скрипта.
  2. Set-PSDebug -Trace 2 — расширенная трассировка (включая вызовы функций и присвоения переменных).
  3. Set-PSDebug -Step — пошаговое выполнение с подтверждением каждой строки.
  4. Set-PSDebug -Strict — строгий режим (ошибка при обращении к несуществующим переменным).
  5. Set-PSDebug -Off — отключение отладки.
  6. Set-PSBreakpoint -Script script.ps1 -Line 42 — установка точки останова по строке.
  7. Set-PSBreakpoint -Command "Get-Process" — breakpoint по команде.
  8. Set-PSBreakpoint -Variable myVar -Mode Write — breakpoint при изменении переменной.
  9. Get-PSBreakpoint / Remove-PSBreakpoint — управление точками останова.
  10. Debug-Job — отладка фонового задания (Start-Job).
  11. Wait-Debugger — приостановка выполнения до подключения отладчика.
  12. Get-Error — подробный разбор последней ошибки (PowerShell 7+).
  13. $Error[0] — просмотр последней ошибки.
  14. Trace-Command — трассировка внутренних компонентов PowerShell.
  15. Enter-PSSession + отладка внутри сессии.
  16. Debug-Process — подключение отладчика к процессу.
  17. Get-PSCallStack — просмотр стека вызовов во время отладки.
  18. StepInto, StepOver, StepOut, Continue — команды отладчика (s, v, o, c).
  19. Write-Debug с $DebugPreference = 'Continue'.
  20. Использование VS Code с расширением PowerShell для графической отладки.

400 команд — это не потолок, это фундамент. PowerShell развивается: каждая версия добавляет новые возможности, модули расширяют его в стороны Azure, Microsoft 365, Kubernetes и дальше. Лучший способ освоить всё это — не читать справочники от начала до конца, а решать реальные задачи. Сломайте что-нибудь в тестовой среде. Починьте это скриптом. Запустите на ста машинах параллельно. Повторите.

Кросс-платформенность (PowerShell 7+ на Linux/macOS) (381–400)

  1. pwsh — запуск PowerShell 7+ (вместо powershell.exe).
  2. Get-OperatingSystem или $IsLinux, $IsMacOS, $IsWindows — проверка платформы.
  3. Get-ChildItem — работает одинаково, но пути: / на Linux/macOS, \ на Windows (лучше Join-Path).
  4. Test-Path, New-Item, Remove-Item — кросс-платформенные.
  5. Invoke-WebRequest / Invoke-RestMethod — одинаково на всех платформах.
  6. ConvertTo-Json / ConvertFrom-Json — полностью кросс-платформенные.
  7. Compress-Archive / Expand-Archive — работают на Linux/macOS.
  8. Get-Process — показывает процессы, но свойства могут отличаться.
  9. Start-Process — поведение отличается (на Linux/macOS использует dotnet или shell).
  10. Get-Service / Start-Serviceне работают на Linux/macOS (только Windows).
  11. Get-CimInstance / WMI — в основном Windows-only.
  12. Get-NetAdapter, Get-NetIPAddress — сетевые cmdlets частично доступны через совместимые модули.
  13. ~/.config/powershell/Microsoft.PowerShell_profile.ps1 — профиль на Linux/macOS.
  14. PSReadLine — работает везде, но настройки клавиш могут отличаться.
  15. ForEach-Object -Parallel — отлично работает на всех платформах.
  16. Избегать Get-WmiObject — используй Get-CimInstance где возможно (но CIM тоже ограничен).
  17. dotnet команды и модули на .NET — полностью кросс-платформенные.
  18. ssh и New-PSSession -SSHConnection — удалённое управление Linux-хостами из PowerShell.
  19. uname, hostnamectl через Invoke-Expression или & для Linux-специфичных команд.
  20. Тестирование скриптов: используй conditional logic (if ($IsLinux) { ... }).

Где-то прямо сейчас системный администратор в три часа ночи смотрит на красный алерт и думает: «Хорошо, что я помню эту команду». А рядом с ним — тот, кто не помнит, но знает, где искать. Разница между ними не в памяти — в привычке держать справочник под рукой и не бояться конвейера. Удачи на дежурстве.

Оставьте комментарий