Руководство по PowerShell (.ps1)

Что такое .ps1 файл?

Файл с расширением .ps1 - это скрипт PowerShell, мощной оболочки Windows для автоматизации задач, администрирования системы и работы с объектами. В отличие от .bat, PowerShell работает с объектами, а не только с текстом - это делает его гибче и безопаснее.

Как создать и запустить .ps1

  • 1. Откройте Блокнот или VS Code.

  • 2. Напишите скрипт, сохраните как "script.ps1".

  • 3. Запустите через PowerShell (правой кнопкой → "Запуск от имени администратора").

Перед запуском проверьте политику выполнения:

Get-ExecutionPolicy

Если стоит Restricted, разрешите выполнение локальных скриптов:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Базовые команды (cmdlets)

  • Get-Help [команда] - подробная справка (добавьте -Online для открытия в браузере).

  • Get-Command - все доступные команды.

  • Get-Command -Module Microsoft.PowerShell* - команды из определённого модуля.

  • Get-Process - список процессов.

  • Stop-Process -Name "chrome" -Force - принудительное завершение процессов.

  • Get-Service - все службы.

  • Get-Service | Where-Object {$_.Status -eq "Running"} - только запущенные службы.

  • Restart-Service -Name "Spooler" - перезапуск службы.

  • Start-Service -Name "Dhcp" - запуск службы.

  • Write-Output "Привет" - вывод строки или объекта.

  • Write-Host "Текст" -ForegroundColor Red -BackgroundColor Black - вывод с цветом.

  • Clear-Host - очистка экрана (аналог cls).

  • Get-History - история выполненных команд.

  • Invoke-History [номер] - повтор команды из истории.

Работа с объектами (фильтрация, сортировка, выбор)

  • Get-ChildItem | Where-Object {$_.Length -gt 1MB} - файлы больше 1 МБ.

  • Get-Process | Sort-Object CPU -Descending - процессы, отсортированные по загрузке CPU.

  • Get-Service | Select-Object Name, Status - выбор конкретных свойств.

  • Get-Process | Select-Object Name, @{Name="Память (МБ)";Expression={$_.WS/1MB}} - вычисляемое поле.

  • Get-EventLog -LogName System -Newest 5 - последние 5 событий из журнала.

  • Get-WinEvent -FilterHashtable @{LogName='Application'; ID=1001} - поиск событий по ID.

Форматирование вывода

  • Format-Table - табличный вывод (по умолчанию).

  • Format-List - детальный вывод построчно.

  • Format-Wide - компактный вывод (например, Get-PSDrive | Format-Wide).

  • Out-GridView - вывод в окне с фильтрацией (GUI).

  • ConvertTo-HTML | Out-File report.html - экспорт в HTML.

  • ConvertTo-CSV | Out-File data.csv - экспорт в CSV.

  • ConvertTo-Json - преобразование объекта в JSON.

  • ConvertFrom-Json - парсинг JSON в объект.

Работа с сетью

  • Test-Connection ya.ru - ping хоста.

  • Resolve-DnsName google.com - DNS-запрос.

  • Get-NetIPConfiguration - информация о сетевых интерфейсах.

  • Get-NetTCPConnection | Where-Object State -eq "Listen" - порты, на которых идёт прослушивание.

  • Invoke-WebRequest https://httpbin.org/ip - HTTP-запрос (аналог curl).

  • (Invoke-WebRequest https://site.com/file.txt).Content - получить содержимое файла.

  • Invoke-RestMethod -Uri "https://api.example.com/data" -Method Get - работа с REST API.

Работа с JSON и файлами

# Чтение JSON
$config = Get-Content "config.json" | ConvertFrom-Json
echo $config.database.host

# Запись JSON
$data = @{ name = "Иван"; age = 30 } | ConvertTo-Json
$data | Set-Content "user.json"

Модули и расширяемость

  • Get-Module -ListAvailable - все установленные модули.

  • Import-Module ActiveDirectory - подключение модуля (если установлен).

  • Find-Module -Name "PSWindowsUpdate" - поиск модуля в PSGallery.

  • Install-Module -Name "PSWindowsUpdate" -Scope CurrentUser - установка модуля.

Пример: Автоматизация резервного копирования с логированием

$source = "$env:USERPROFILE\Documents"
$dest = "D:\Backup\Docs_$(Get-Date -Format 'yyyyMMdd')"
$log = "$PSScriptRoot\backup.log"

Add-Content $log "[$(Get-Date)] Запуск резервного копирования..."

if (Test-Path $source) {
    Copy-Item $source $dest -Recurse -Force
    Add-Content $log "Успешно: $dest"
} else {
    Add-Content $log "ОШИБКА: Папка $source не найдена!"
}

Add-Content $log "[$(Get-Date)] Завершено."

Пример: Проверка обновлений Windows

# Требует модуль PSWindowsUpdate
Install-Module -Name PSWindowsUpdate -Force
Get-WindowsUpdate
Install-WindowsUpdate -AcceptAll -AutoReboot

Полезные переменные окружения

  • $env:USERNAME - имя пользователя.

  • $env:COMPUTERNAME - имя ПК.

  • $env:TEMP - путь к временной папке.

  • $PSScriptRoot - путь к скрипту (аналог %~dp0 в .bat).

  • $MyInvocation.MyCommand.Name - имя текущего скрипта.

Советы по стилю и безопасности

  • Всегда используйте [CmdletBinding()] в функциях для поддержки общих параметров (-Verbose, -WhatIf).
  • Используйте param() для входных параметров - это делает скрипты переиспользуемыми.
  • Добавляйте #Requires -RunAsAdministrator в начало, если нужны права администратора.
  • Для отладки используйте Write-Debug, Write-Verbose.
  • Никогда не выполняйте скрипты из ненадёжных источников без проверки политики: Get-ExecutionPolicy.

Переменные

  • $имя = "значение" - создание переменной (например: $user = $env:USERNAME).

  • Write-Host $имя - вывод значения.

  • [int]$число = 42 - переменная с типом.

  • $PSScriptRoot - путь к папке, где находится скрипт.

Условия (if / else)

if ($env:OS -eq "Windows_NT") {
    Write-Host "Это Windows"
} else {
    Write-Host "Неизвестная ОС"
}

Операторы сравнения:

  • -eq - равно
  • -ne - не равно
  • -lt - меньше
  • -gt - больше
  • -like - с подстановкой (например: "hello" -like "h*")
  • -in - проверка вхождения в массив

Циклы

Цикл по числам:

for ($i = 1; $i -le 5; $i++) {
    Write-Host "Итерация $i"
}

Перебор файлов:

Get-ChildItem *.txt | ForEach-Object {
    Write-Host "Найден файл: $($_.Name)"
}

While-цикл:

$count = 0
while ($count -lt 3) {
    Write-Host "Счётчик: $count"
    $count++
}

Работа с файлами

  • New-Item "log.txt" -ItemType File - создаёт файл.

  • Set-Content "data.txt" "Текст" - записывает текст в файл.

  • Add-Content "log.txt" "Новая строка" - добавляет строку в конец файла.

  • Get-Content "file.txt" - читает содержимое файла.

  • Remove-Item "temp.*" - удаляет файлы по маске.

  • Copy-Item "C:\src\*" "D:\backup\" - копирует файлы.

  • Move-Item "old.txt" "new.txt" - перемещает или переименовывает.

Функции

function Say-Hello {
    param([string]$name = "Гость")
    Write-Host "Привет, $name!"
}
# Вызов функции
Say-Hello "Алексей"

Пример: Резервное копирование

# Создаёт резервную копию папки Documents
$source = "$env:USERPROFILE\Documents"
$dest = "D:\Backup\Docs_$(Get-Date -Format 'yyyyMMdd')"

if (Test-Path $source) {
    Copy-Item $source $dest -Recurse -Force
    Write-Host "Резервное копирование завершено."
} else {
    Write-Warning "Папка $source не найдена."
}

Пример: Мониторинг диска

$drive = Get-PSDrive C
if ($drive.Free / 1GB -lt 10) {
    Write-Host "⚠️ На диске C: меньше 10 ГБ свободного места!" -ForegroundColor Red
} else {
    Write-Host "✅ Диск в норме: $($drive.Free / 1GB:N2) ГБ свободно." -ForegroundColor Green
}

Работа с реестром

  • Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion - чтение раздела реестра.

  • New-Item "HKCU:\Software\MyApp" - создаёт ключ.

  • Set-ItemProperty "HKCU:\Software\MyApp" "Version" "1.0" - устанавливает значение.

Безопасность и советы

  • PowerShell-скрипты могут быть опасны - запускайте только из доверенных источников.
  • Используйте Set-ExecutionPolicy RemoteSigned - этого достаточно для личного использования.
  • Подписывайте скрипты в корпоративной среде с помощью цифровых сертификатов.
  • Для сложной автоматизации используйте модули и param() для входных данных.
  • Логируйте действия: Add-Content "log.txt" "$(Get-Date): Операция выполнена"

Совет: PowerShell - это основа современного администрирования Windows. Изучите Get-Member и Select-Object - они помогут работать с объектами эффективнее.

Скопировано:
Назад к разделу: Записи