Примеры команд в PowerShell
PowerShell — объектно-ориентированная оболочка и язык автоматизации, встроенная в современные версии Windows и доступная кроссплатформенно (PowerShell Core). В отличие от традиционных текстовых оболочек (CMD, Bash), PowerShell оперирует объектами — экземплярами .NET-классов — что позволяет строить конвейеры, сохраняя структурированные данные без необходимости повторного парсинга текста.
Ниже приведены практически значимые примеры команд и паттернов, актуальные для повседневной работы системного администратора, DevOps-инженера и разработчика. Все примеры проверены на PowerShell 5.1 (Windows) и PowerShell 7.4+ (Core), если не указано иное.
1. Базовые команды и навигация
Получение справки
Get-Help Get-Process # Справка по командлету
Get-Help Get-Process -Examples # Только примеры использования
Get-Help about_* # Справка по концепциям (например: `about_Pipelines`)
Update-Help # Обновление локальной справки (требует прав администратора)
Примечание:
Get-Helpиспользует XML-документацию, встроенную в модули. В PowerShell 7+ справка по умолчанию загружается из интернета, если локальные файлы отсутствуют.
Навигация по файловой системе
Get-Location # Текущий рабочий каталог (аналог `pwd`)
Set-Location C:\Temp # Смена каталога (аналог `cd`)
Get-ChildItem # Список файлов и подкаталогов (аналог `ls`/`dir`)
Get-ChildItem -Recurse -File # Только файлы, рекурсивно
Get-ChildItem -Filter *.log # Фильтрация по маске (эффективнее `-Include`)
Get-ChildItem -Depth 2 # Ограничение глубины рекурсии (PS 5.1+)
Разница:
-Filterвыполняется на уровне поставщика (provider-level), быстрее.-Include/-Exclude— на уровне PowerShell, после получения объектов.
Работа с дисками и поставщиками (Providers)
Get-PSDrive # Список всех дисков (FileSystem, Registry, Certificate и др.)
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT # Монтирование раздела реестра как диска
Set-Location HKCR:\txtfile\shell\open\command
Get-Item . # Получить объект текущего пути
2. Работа с файлами и каталогами
Создание и удаление
New-Item -Path . -Name "test.txt" -ItemType File
New-Item -Path . -Name "logs" -ItemType Directory
# Создать файл с содержимым
Set-Content -Path "config.json" -Value '{ "debug": true }'
Add-Content -Path "log.txt" -Value "$(Get-Date): Process started"
# Безопасное удаление (с проверкой существования)
Remove-Item -Path "temp.log" -ErrorAction SilentlyContinue
Копирование и перемещение
Copy-Item -Path "source.txt" -Destination "backup.txt" -Force
Move-Item -Path "old\" -Destination "archive\" -WhatIf # Просмотр без выполнения
Чтение и анализ содержимого
Get-Content .\log.txt -Tail 10 # Последние 10 строк (аналог `tail`)
Get-Content .\data.csv | ConvertFrom-Csv # Чтение CSV как объектов
Get-Content .\config.json | ConvertFrom-Json # Парсинг JSON
# Поиск строк, содержащих шаблон (регистронезависимо по умолчанию)
Select-String -Path *.log -Pattern "ERROR|WARN"
Select-String -Path access.log -Pattern "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" -AllMatches
Важно:
Select-Stringвозвращает объектыMicrosoft.PowerShell.Commands.MatchInfo, содержащие не только строку, но и номер строки, контекст, совпадения — удобно для последующей обработки.
3. Работа с процессами и службами
Управление процессами
Get-Process # Все процессы
Get-Process -Name chrome # По имени
Get-Process -Id 1234 # По PID
Stop-Process -Name notepad -Force # Принудительное завершение
# Запуск нового процесса с параметрами
Start-Process -FilePath "notepad.exe" -ArgumentList "C:\Temp\readme.txt"
Start-Process -FilePath "powershell.exe" -ArgumentList "-Command", "Get-Date" -Wait
# Получение деревьев родитель-потомок
Get-CimInstance Win32_Process |
Where-Object { $_.ParentProcessId -eq (Get-Process -Id $PID).Id }
Работа со службами (Services)
Get-Service # Все службы
Get-Service -Name Spooler # Конкретная служба
Start-Service -Name Spooler
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Automatic
# Службы, зависшие в состоянии "StartPending"
Get-Service | Where-Object { $_.Status -eq 'StartPending' }
Альтернатива через CIM/WMI (более надёжно для удалённого управления и в PS Core):
Get-CimInstance -ClassName Win32_Service -Filter "Name='Spooler'"
Invoke-CimMethod -ClassName Win32_Service -MethodName StartService -Arguments @{ Name = 'Spooler' }
4. Работа с реестром Windows
PowerShell позволяет обращаться к реестру как к файловой системе благодаря поставщику Registry.
# Чтение значения
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId
# Создание ключа и значения
New-Item -Path "HKCU:\Software\MyApp" -Force
Set-ItemProperty -Path "HKCU:\Software\MyApp" -Name "LogLevel" -Value 3 -Type DWord
# Удаление значения
Remove-ItemProperty -Path "HKCU:\Software\MyApp" -Name "TempFlag"
# Экспорт/импорт раздела
Export-Clixml -Path "registry_backup.xml" -InputObject (Get-Item -Path "HKCU:\Software\MyApp")
# или
reg export "HKCU\Software\MyApp" backup.reg
Предупреждение: Операции с
HKLMтребуют прав администратора. Изменения вHKCUвлияют только на текущего пользователя.
5. Сетевые операции
Проверка связи и диагностика
Test-NetConnection google.com # Аналог `ping` + порт (по умолчанию 80)
Test-NetConnection 8.8.8.8 -Port 53 # Проверка DNS-порта
Test-NetConnection -ComputerName srv01 -CommonTCPPort SMB
# Просмотр и управление сетевыми интерфейсами
Get-NetIPAddress
Get-NetTCPConnection | Where-Object { $_.State -eq 'Listen' }
Get-NetRoute -DestinationPrefix "0.0.0.0/0" # Шлюз по умолчанию
# Временный веб-сервер (PowerShell 7+)
python -m http.server 8000 # если Python доступен
# или чисто на PS (упрощённо):
Invoke-WebRequest -Uri "http://httpbin.org/get" -Method GET
Работа с веб-API (REST)
# Простой GET
$response = Invoke-RestMethod -Uri "https://api.github.com/users/torvalds"
# POST с JSON
$body = @{ name = "test-repo"; auto_init = $true } | ConvertTo-Json
$headers = @{ Authorization = "token $env:GITHUB_TOKEN" }
Invoke-RestMethod -Uri "https://api.github.com/user/repos" -Method Post -Body $body -Headers $headers -ContentType "application/json"
Разница:
Invoke-RestMethod— автоматически десериализует JSON/XML в объекты.Invoke-WebRequest— возвращает объектWebResponse, включая заголовки, статус-код и «сырое» тело.
6. Работа с переменными, объектами и конвейерами
Основы объектной модели
$proc = Get-Process -Name explorer
$proc.GetType().FullName # System.Diagnostics.Process
# Выбор свойств
$proc | Select-Object Id, ProcessName, WorkingSet64
# Вычисляемые свойства
Get-Process |
Select-Object Name,
@{ Name = 'MemoryMB'; Expression = { [math]::Round($_.WorkingSet64 / 1MB, 2) } }
# Группировка
Get-Service | Group-Object -Property Status
Get-ChildItem | Group-Object -Property Extension
Отладка и инспекция
# Просмотр всех свойств/методов объекта
Get-Process | Get-Member
# Просмотр только методов
Get-Process | Get-Member -MemberType Method
# «Развернуть» объект в список свойств (как в отладчике)
Get-Date | Format-List *
# Потоковая отладка: промежуточный вывод в конвейере
Get-Process |
Where-Object CPU -gt 100 |
ForEach-Object { Write-Verbose "Обрабатывается: $($_.Name)" -Verbose; $_ } |
Select-Object Name, CPU
7. Управление модулями и профилем
Загрузка и установка модулей
Get-Module -ListAvailable # Все доступные модули
Get-Module # Загруженные в сессию
Import-Module ActiveDirectory # Явная загрузка
Import-Module .\MyModule.psm1 # Из локального файла
# Установка из PSGallery
Install-Module -Name PSScriptAnalyzer -Scope CurrentUser -Force
Update-Module -Name Az
# Просмотр зависимостей
Find-Module -Name ExchangeOnlineManagement | Select-Object -ExpandProperty Dependencies
Работа с профилем
$PROFILE # Путь к текущему профилю
Test-Path $PROFILE # Проверить существование
New-Item -Path $PROFILE -Type File -Force
notepad $PROFILE # Редактирование
Типичное содержимое профиля:
Set-StrictMode -Version Latest
$ProgressPreference = 'SilentlyContinue' # Ускорение при работе с сетью/дисками
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
8. Работа с WMI и CIM (Windows Management Instrumentation / Common Information Model)
WMI — устаревшая, но совместимая технология. CIM — её современная, кроссплатформенная замена (через WS-Management или DCOM). Предпочтительно использовать Get-CimInstance, а не Get-WmiObject (deprecated в PowerShell Core).
Базовые запросы
# Информация о системе
Get-CimInstance -ClassName Win32_ComputerSystem |
Select-Object Name, Manufacturer, Model, TotalPhysicalMemory
# Диски и разделы
Get-CimInstance -ClassName Win32_DiskDrive |
Select-Object DeviceID, Model, Size
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType = 3" |
Select-Object DeviceID, VolumeName, @{n='FreeGB';e={[math]::Round($_.FreeSpace/1GB,2)}}
# Установленные обновления (HotFix)
Get-CimInstance -ClassName Win32_QuickFixEngineering |
Select-Object HotFixID, Description, InstalledOn
Удалённое выполнение (требует настройки WinRM)
# Проверка подключения
Test-WSMan -ComputerName SRV01
# Запрос на удалённой машине
Get-CimInstance -ClassName Win32_BIOS -ComputerName SRV01,SRV02 -Credential (Get-Credential)
# Сессия для многократного использования (эффективнее)
$session = New-CimSession -ComputerName SRV01 -Credential adm@contoso.com
Get-CimInstance -ClassName Win32_OperatingSystem -CimSession $session
Remove-CimSession -CimSession $session
Выполнение методов
# Перезагрузка удалённой машины
Invoke-CimMethod -ClassName Win32_OperatingSystem -MethodName Reboot -CimSession $session
# Создание точки восстановления
$rp = @{
Description = "Pre-Update $(Get-Date -Format 'yyyy-MM-dd')"
EventType = 100 # BEGIN_SYSTEM_CHANGE
RestorePointType = 12 # MODIFY_SETTINGS
}
Invoke-CimMethod -ClassName SystemRestore -Namespace root\default -MethodName CreateRestorePoint -Arguments $rp
Примечание:
root\default\SystemRestoreтребует запуска PowerShell от имени администратора и включённой службы «Теневое копирование томов».
9. Параллельная обработка и фоновые задания
Фоновые задания (Background Jobs)
# Запуск длительной операции в фоне
Start-Job -ScriptBlock { Start-Sleep -Seconds 10; Get-Process }
# Просмотр состояния
Get-Job
# Получение результата
Receive-Job -Id 1 -Keep # -Keep сохраняет результат для повторного чтения
Remove-Job -Id 1 # Очистка после завершения
Распараллеливание через ForEach-Object -Parallel (PowerShell 7+)
# Параллельная обработка списка серверов
$servers = 'SRV01', 'SRV02', 'SRV03'
$servers | ForEach-Object -Parallel {
$os = (Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $_).Caption
[PSCustomObject]@{ Server = $_; OS = $os }
} -ThrottleLimit 4 # не более 4 одновременных потоков
Ручное управление через RunspacePool (.NET, максимальная производительность)
# Подготовка пула потоков
$runspacePool = [runspacefactory]::CreateRunspacePool(1, 5) # min 1, max 5
$runspacePool.Open()
$jobs = @()
$servers | ForEach-Object {
$ps = [powershell]::Create().AddScript({
param($server)
try {
$ip = [System.Net.Dns]::GetHostAddresses($server)[0].IPAddressToString
[PSCustomObject]@{ Host = $server; IP = $ip; Status = 'OK' }
} catch {
[PSCustomObject]@{ Host = $server; IP = $null; Status = 'Fail'; Error = $_.Exception.Message }
}
}).AddArgument($_)
$ps.RunspacePool = $runspacePool
$jobs += [PSCustomObject]@{
Server = $_
Job = $ps
Handle = $ps.BeginInvoke()
}
}
# Ожидание завершения и сбор результатов
$jobs | ForEach-Object {
$_.Job.EndInvoke($_.Handle)
$_.Job.Dispose()
}
$runspacePool.Close()
$runspacePool.Dispose()
Подходит для высоконагруженных сценариев (сотни хостов, API-вызовы), где важна скорость и контроль над ресурсами.
10. Обработка ошибок и логирование
Структурированная обработка исключений
try {
$content = Get-Content -Path "C:\NonExistent\file.txt" -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
Write-Error "Файл не найден. Проверьте путь."
} catch {
Write-Error "Необработанная ошибка: $($_.Exception.Message)"
# Дополнительно: $_.ScriptStackTrace — стек вызовов
}
Глобальный обработчик ошибок
$ErrorActionPreference = 'Stop' # превращает все ошибки в terminating
$WarningPreference = 'SilentlyContinue' # подавление предупреждений
# Или только для конкретного блока:
& {
$ErrorActionPreference = 'Stop'
# ... опасный код ...
}
Логирование в файл (с метками времени и уровнем)
function Write-Log {
param(
[string]$Message,
[ValidateSet('INFO','WARN','ERROR','DEBUG')]$Level = 'INFO',
[string]$Path = "$env:TEMP\powershell.log"
)
$timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'
"$timestamp [$Level] $Message" | Out-File -FilePath $Path -Append -Encoding UTF8
}
# Пример использования
Write-Log "Скрипт запущен" -Level INFO
try {
Remove-Item "C:\critical\file.txt" -ErrorAction Stop
Write-Log "Файл удалён" -Level INFO
} catch {
Write-Log "Ошибка удаления: $($_.Exception.Message)" -Level ERROR
}
Для продакшн-проектов рекомендуется использовать библиотеки вроде PSFramework (
Write-PSFMessage) или интеграцию с Serilog через .NET.
11. Интеграция с .NET и вызов API напрямую
PowerShell — надстройка над CLR; любой .NET-код доступен напрямую.
Использование статических методов и типов
# Работа со строками
[regex]::IsMatch("test@example.com", "^\w+@[\w\.-]+\.\w+$") # → True
# Генерация GUID
[guid]::NewGuid().ToString()
# Преобразование кодировок
$bytes = [System.Text.Encoding]::UTF8.GetBytes("Привет")
[System.Text.Encoding]::ASCII.GetString($bytes) # → "??????"
Вызов WinAPI через P/Invoke (пример: получение DPI экрана)
$signature = @'
[DllImport("user32.dll")]
public static extern uint GetDpiForWindow(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
'@
Add-Type -MemberDefinition $signature -Name Win32 -Namespace Native
$hwnd = [Native.Win32]::GetDesktopWindow()
$dpi = [Native.Win32]::GetDpiForWindow($hwnd)
Write-Host "DPI основного дисплея: $dpi"
Подобный подход позволяет реализовать функциональность, отсутствующую в стандартных командлетах, без написания внешних сборок.
12. Полезные диагностические однострочники
Система и производительность
# Загрузка CPU за последнюю минуту (грубая оценка)
(Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
# Свободная память (в %)
$mem = Get-CimInstance Win32_OperatingSystem
[Math]::Round(100 * ($mem.FreePhysicalMemory / $mem.TotalVisibleMemorySize), 1)
# Топ-5 процессов по потреблению CPU
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name,CPU,WS
Сеть и безопасность
# Прослушиваемые порты + процессы
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort,
@{n='Process';e={(Get-Process -Id $_.OwningProcess -ErrorAction 0).ProcessName}}
# Учётные записи с истекающим паролем (< 7 дней)
Search-ADAccount -PasswordNeverExpires $false -UsersOnly |
Get-ADUser -Properties PasswordLastSet, PasswordNeverExpires |
Where-Object { $_.PasswordLastSet -lt (Get-Date).AddDays(-83) } # 90-7=83
# Проверка наличия Defender в режиме реального времени
(Get-MpComputerStatus).RealTimeProtectionEnabled
Аудит и соответствие
# Проверка политик групповой безопасности (локальных)
secedit /export /cfg "$env:TEMP\local.cfg" /quiet
Select-String -Path "$env:TEMP\local.cfg" -Pattern "PasswordHistorySize|MinimumPasswordAge"
# Отключение ненужных служб (пример «тихой» очистки)
Get-Service |
Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' -and $_.Name -in @('XboxGipSvc','Fax') } |
Stop-Service -Force -PassThru | Set-Service -StartupType Disabled
13. Практические паттерны: шаблоны для повторного использования
Параметризованный скрипт с валидацией
param(
[Parameter(Mandatory)]
[ValidateScript({ Test-Path $_ -PathType Container })]
[string]$Path,
[ValidateRange(1, 100)]
[int]$Depth = 1
)
Get-ChildItem -Path $Path -Recurse -Depth $Depth
Создание модуля из функций
# MyTools.psm1
function Get-FreeDiskSpace {
[CmdletBinding()]
param([string]$Drive = 'C:')
Get-PSDrive -Name $Drive |
Select-Object Name, @{n='FreeGB';e={[math]::Round($_.Free/1GB, 2)}}
}
Export-ModuleMember -Function Get-FreeDiskSpace
Затем:
Import-Module .\MyTools.psm1
Get-FreeDiskSpace -Drive D
14. Отладка и профилирование
Точки останова
# По строке
Set-PSBreakpoint -Script "deploy.ps1" -Line 42
# По переменной (когда её значение изменяется)
Set-PSBreakpoint -Variable "config" -Mode Write
# По команде
Set-PSBreakpoint -Command "Invoke-RestMethod"
Измерение производительности
# Время выполнения
Measure-Command { Get-ChildItem -Recurse -Path C:\Windows\System32 }
# Память
$memBefore = (Get-Process -Id $PID).WorkingSet64
# ... операция ...
$memAfter = (Get-Process -Id $PID).WorkingSet64
"Прирост памяти: $([math]::Round(($memAfter - $memBefore) / 1MB, 2)) MB"