Перейти к основному содержимому

Примеры команд в 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"