PowerShell это не просто командная строка с красивым именем. Это язык, на котором Windows разговаривает сама с собой: тихо, методично, без лишних движений. Пока одни администраторы кликают по меню и ждут, пока откроется нужный раздел панели управления, другие уже получили результат, записали его в CSV, отфильтровали по условию и отправили на три сервера одновременно. https://seberd.ru/19548/
Этот справочник собирался не ради полноты ради полноты. За каждой командой здесь стоит реальная задача: разобраться, что происходит в системе прямо сейчас; найти того, кто съедает всю память; понять, почему служба упала в три часа ночи; не дать коллеге случайно удалить не ту OU.
PowerShell умеет быть простым одна строка, один результат. И умеет быть сложным — параллельные задания, удалённые сессии, модули для Azure и Microsoft 365, интеграция с секретными хранилищами. Разница между джуниором и сеньором здесь нередко измеряется не знанием синтаксиса, а пониманием того, когда писать Where-Object, а когда нормальный foreach с условием внутри.
Читайте не по порядку. Ищите то, что нужно прямо сейчас. Возвращайтесь, когда задача изменится.
Справочник команд PowerShell для автоматизации и администрирования
Справка и навигация (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) { ... }).
Где-то прямо сейчас системный администратор в три часа ночи смотрит на красный алерт и думает: «Хорошо, что я помню эту команду». А рядом с ним — тот, кто не помнит, но знает, где искать. Разница между ними не в памяти — в привычке держать справочник под рукой и не бояться конвейера. Удачи на дежурстве.