Руководство по 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 - они помогут работать с объектами эффективнее.