Первые версии Linux- и Unix-дистрибутивов традиционно управлялись при помощи командной строки. Несмотря на то, что со временем были выпущены различные графические оболочки, такие как GNOME, KDE, Cinnamon, XFCE, Linux стал прочно ассоциироваться с управлением через терминал. В то же время операционные системы семейства Windows ассоциируются именно с использованием графического интерфейса. Однако, существует способ, при котором можно управлять ОС Windows из командной оболочки, — с помощью инструмента PowerShell. Сегодня мы рассмотрим синтаксис и основы работы с PowerShell.
Что такое PowerShell?
PowerShell — это мощная кросс-платформенная среда автоматизации и управления конфигурациями, разработанная корпорацией Microsoft. PowerShell объединяет в себе командную оболочку и язык сценариев, что позволяет выполнять административные задачи, автоматизировать процессы и управлять системой Windows.
История развития PowerShell: от Monad до современной версии
История PowerShell берет свои корни в начале 2000-х годов, когда Microsoft решила создать более мощную и продвинутую командную оболочку для Windows, взамен устаревшей cmd
.
В 2002 году Microsoft предложила концепцию объектно-ориентированной оболочки, которая должна была заменить командный процессор Windows. Так родился проект Monad. Среди ключевых особенностей Monad можно выделить следующие:
- Использование объектов вместо простого текстового ввода/вывода, в отличие от Unix-оболочек.
- Единый подход к управлению локальными и удаленными системами.
- Глубокая интеграция с .NET Framework.
- Конвейерная (pipeline) обработка данных с передачей объектов, а не строк.
Впервые широкой публике Monad был представлен в 2003 году, а в 2005 году вышла первая публичная бета-версия. Однако после выхода операционной системы Windows Vista Microsoft решила сменить название c Monad на привычное нам сегодня PowerShell.
В ноябре 2006 года Microsoft выпустила Windows PowerShell под версией 1.0, которая включала в себя полную интеграцию с .NET Framework, поддержку Cmdlets (небольшие команды, работающие с объектами) и интеграцию с WMI (Windows Management Instrumentation). Однако PowerShell версии 1.0 еще не был предустановлен в Windows и поставлялся как отдельный компонент.
В 2009 году была выпущена версия 2.0, в которую были интегрированы такие функции, как удаленное выполнение команд и фоновое выполнение задач, добавлена поддержка модулей для расширения функционала и улучшен обработчик ошибок. Именно с версией 2.0 PowerShell был интегрирован в дистрибутивы Windows, начиная с Windows 7 и Windows Server 2008 R2.
С тех пор было выпущено еще 6 основных релизов:
- PowerShell 2.0 (2009)
- PowerShell 3.0 (2012)
- PowerShell 4.0 (2013)
- PowerShell 5.0 (2016)
- PowerShell Core 6.0 (2016–2020)
- PowerShell 7 (2020)
На момент написания статьи актуальной является версия 7.5.0.
Архитектура и принципы работы PowerShell
Архитектура PowerShell
Архитектура PowerShell основана на следующих компонентах:
- Командная оболочка
Представляет собой интерактивную командную строку, где пользователь может вводить команды для управления операционной системой и ее объектами.
- Язык сценариев
PowerShell использует свой собственный язык сценариев, который сочетает в себе возможности командной строки и полноценного языка программирования. Язык сценариев поддерживает переменные, циклы, условия, функции и модули.
- Платформа .NET
PowerShell построен на модульной платформе .NET, что позволяет ему взаимодействовать с объектами .NET и использовать их методы и свойства.
- Модули и провайдеры
Модули — это пакеты, содержащие команды и функции. Позволяют расширять функциональность PowerShell. Провайдеры — это компоненты, которые предоставляют доступ к данным в различных хранилищах (например, файловая система, реестр, переменные среды).
Принципы работы PowerShell
Принцип работы PowerShell основан на объектно-ориентированном подходе — в отличие от традиционных командных оболочек, которые работают с текстом, PowerShell работает с объектами. Каждая команда возвращает объект, который содержит свойства и методы. Это позволяет легко обрабатывать данные, передавать их между командами и использовать в скриптах.
Одной из мощных особенностей PowerShell является возможность передачи вывода одной команды (объектов) непосредственно в другую с помощью символа |
. Благодаря этому можно строить цепочки команд, где каждая команда обрабатывает или преобразует объекты, которые передаются дальше по цепочке.
Отличия PowerShell от командной строки (CMD)
Несмотря на схожесть, PowerShell и командная строка (CMD) — это два разных инструмента. PowerShell значительно мощнее и функциональнее обычной командной строки Windows. Основные отличия заключаются в следующем:
- Функционал
CMD поддерживает минимальный и ограниченный набор команд. Также с помощью CMD можно запускать скрипты с расширением .bat
. В свою очередь, PowerShell является объектно-ориентированной оболочкой и скриптовым языком и основан на модульной платформе .NET.
С помощью PowerShell можно выполнять как простые действия, связанные, например, с файлами и пакетами, так и сложные задачи управления реестром, службами, процессами и облачными ресурсами.
- Принцип работы
CMD работает с текстовыми командами (cd
, dir
, copy
, del
и т. д.) и обрабатывает строки с командами дальнейшей передачей в стандартный вывод.
PowerShell работает с объектами .NET, которые называются командлетами (cmdlets, например Get-Process
, Get-Service
, Stop-Process
и т. д.), что позволяет передавать сложные структуры данных между командами без необходимости парсинга текста.
- Автоматизация и запуск скриптов
С помощью CMD можно запускать скрипты с расширением .bat
, однако они ограничены в возможностях.
При помощи PowerShell можно запускать скрипты с расширением .ps1
, которые могут выполнять сложные операции, а также работать с API, базами данных и облачными сервисами.
vds
Установка PowerShell на Windows
Несмотря на то, что командная строка (cmd) и Powershell уже предустановлены во всех последних версиях Windows, PowerShell можно установить отдельно.
Отдельная установка может понадобиться, если предустановленная версия отличается от последней доступной актуальной версии.
Установить PowerShell в ОС Windows можно тремя разными способами:
- Через Microsoft Store (только для ОС Windows 10 и Windows 11).
- При помощи установочного файла с расширением
.msi
. - С помощью утилиты
winget
(winget
должен быть установлен отдельно).
Microsoft Store
Данный метод установки поддерживается только на Windows 10 и Windows 11. Процесс установки для двух дистрибутивов идентичен.
- Запускаем приложение Microsoft Store и в поиске вводим «powershell». Существует 2 версии PowerShell — Обычная (стабильная) и Preview. Версия Preview является тестовой и может содержать ошибки, однако она позволяет ознакомиться с новым функционалом, который еще не доступен в обычной (стабильной) версии.
Мы установим обычную стабильную версию:
- Для установки нажимаем на кнопку «Получить» и дожидаемся завершения установочного процесса:
Для запуска введите «powershell» в поиске Windows.
Также стоит обратить внимание, что при установке старая версия PowerShell не будет удалена. Чтобы отличить новую установленную версию от старой, достаточно посмотреть на имя приложения — новая версия называется PowerShell, а старая версия (она же предустановленная) называется Windows PowerShell:
MSI-пакет
Это более универсальный способ установки, так как подходит для более широкого спектра дистрибутивов, включая Windows 10 сборки 1607 и выше, Windows 11, Windows Server 2016 и выше.
- Переходим на сайт «Майкрософт» и выбираем необходимый установщик в зависимости от используемой архитектуры — 64-битная, 86 (32-битная) или arm64:
- Далее запускаем скачанный файл и нажимаем на кнопку «Next».
- Выбираем место на диске куда будет установлен PowerShell или оставляем значение по умолчанию.
- При необходимости выбираем дополнительные опции:
-
- Add PowerShell to Path Environment Variable — добавляет полный путь до исполняемого файла PowerShell в системную переменную окружения PATH.
- Register Windows Event Logging Manifest — регистрирует событийный манифест (
PowerShellCore.EventManifest.dll
) в системе, что позволяет логировать ошибки и события PowerShell в «Просмотре событий Windows» (Event Viewer). - Enable PowerShell remoting — включает функцию PowerShell Remoting для управления компьютером удаленно при помощи WSMan (WinRM).
- Disable Telemetry — отключает сбор телеметрии.
- Add ‘Open here’ context menus to Explorer — добавляет пункт «Открыть в PowerShell» в контекстное меню проводника.
- Add ‘Run with PowerShell 7’ context menu for PowerShell files — добавляет пункт «Запуск с PowerShell 7» (Run with PowerShell 7) в контекстное меню для
.ps1
-файлов.
- Далее установщик предложит включить использование службы Microsoft Update для получения актуальной версии PowerShell. Можно как согласиться, так и полностью отказаться от данной службы:
- На последнем шаге нажимаем на кнопку «Install, чтобы запустить процесс установки.
- После того как установка будет завершена, нажимаем на кнопку Finish».
Для запуска PowerShell необходимо ввести имя программы в поиске. Установленная версия будет содержать цифру основной версии и архитектуру, в то время как предустановленная версия содержит только название:
Так выглядит окно запущенного PowerShell:
Предустановленная версия PowerShell не будет удалена, что означает возможность использования обеих версий на одном компьютере.
winget
winget (Windows Package Manager) — это встроенный менеджер пакетов в Windows 10 и Windows 11, который позволяет легко устанавливать, обновлять и удалять программы через командную строку. Является аналогом apt
/ yum
/ dnf
в Linux-дистрибутивах.
По умолчанию winget
уже предустановлен в Windows 10 1809 (сборка 17763) и выше, а также во всех версиях Windows 11. Windows Server 2019 не поддерживается, однако возможна установка на Windows Server 2022. Чтобы проверить, установлен ли winget
в вашей версии Windows, необходимо выполнить следующую команду в PowerShell:
Get-AppPackage *Microsoft.DesktopAppInstaller*|select Name,PackageFullName
Если в ответ команда вернула имя пакета, как на скриншоте выше, то winget
уже установлен в системе. Если же winget
не установлен, его необходимо установить вручную:
- Переходим на страницу проекта в GitHub.
- Находим в разделе «Releases» последний релиз — с пометкой
latest
. В данном случае это релиз с номером 1.9.25200. Скачиваем файл с расширением.msixbundle
:
winget
входит в состав приложения «Установщик приложения», которое уже может быть установлено в вашей системе. Если при запуске установочного файла отображается сообщение, что такое приложение уже установлено, значит,winget
уже присутствует в системе:
- Если же «Установщик приложения» отсутствует, установите его вручную, следуя инструкциям на экране. После завершения установки можно проверить версию
winget
и убедиться, что программа была установлена:
winget --version
- Для установки PowerShell сначала выясним, какие версии доступны.
winget search Microsoft.PowerShell
Как и при установке из магазина Windows, доступны две версии: обычная (стабильная) и Preview (бета-версия).
- Установим обычную версию при помощи команды:
winget install --id Microsoft.PowerShell --source winget
Как и при использовании других методов установки, установка новой версии PowerShell через winget не удаляет старую версию утилиты.
Основы работы с PowerShell
Рассмотрим синтаксис PowerShell и работу с командлетами (cmdlets).
Командлеты (cmdlets)
В основу PowerShell заложена работа с командлетами.
Командлеты — это встроенные команды, используемые для выполнения различных задач, таких как управление файлами, процессами, службами, пользователями и сетевыми настройками.
Синтаксис командлетов следующий:
<глагол>-<существительное> [-Параметры]
Например:
Get-Process
— Получить список процессовGet-ChildItem -Path C:\Users
— Отобразить файлы и директории в каталогеC:\Users
.
При использовании командлетов в ответ они возвращают не просто текст, а объекты платформы .NET. Это предоставляет мощные возможности для обработки данных.
Переменные
Как и в любом другом языке программирования или командной оболочке, переменные в PowerShell предназначены для хранения различных объектов: строк, чисел, объектов, массивов, хэш-таблиц. Переменные обозначаются знаком $
.
Рассмотрим переменные на практике. Объявим две переменные: одну с именем myvar1
и содержащую строковой тип данных, и вторую — с именем myvar2
и содержащую числовой тип данных:
$myvar1 = “This is string variable”
$myvar2 = 32
Для вывода значения переменной используется оператор Write-Output
:
Write-Output $myvar1
Write-Output $myvar2
PowerShell автоматически определяет тип данных, но при желании его можно задавать явно:
[string]$myvar1 = “This is string variable”
[int]$myvar2 = 32
Помимо хранения строковых и числовых данных, в переменных можно хранить массивы и хэш-таблицы (они же словари).
Создадим переменную var-array
, в которой будет храниться массив цифр от 1 до 5:
$var_array = @(1, 2, 3, 4, 5)
Чтобы вывести значения объектов, хранящихся в массиве, необходимо написать имя переменной и в квадратных скобках указать порядковый номер объекта. Как и в других языках программирования, счет объектов начинается с 0, поэтому для вывода цифры 1 необходимо ввести 0:
$var_array[0]
Создадим другую переменную с именем var-hash
, в которой будет храниться хэш-таблица или словарь данных. Структура данных имеет вид: Ключ: Значение
.
$var_hash = @{ "ID" = 1; "Name" = "Alex" }
Для вывода значений необходимо указать имя переменной и ключ, например:
$var_hash["Name"]
Также с переменными можно производить различные арифметические операции, например, сложение:
$first_num = 20
$second_num = 30
$sum = $first_num + $second_num
Write-Output $sum
Операторы
В PowerShell присутствуют следующие операторы:
- Арифметические операторы
- Операторы сравнения
- Логические операторы
- Операторы массивов
Рассмотрим их на практике.
Арифметические операторы
Используются для математических вычислений. В таблице ниже перечислены все арифметические операторы, доступные в PowerShell:
Оператор |
Описание |
+ |
Сложение |
- |
Вычитание |
* |
Умножение |
/ |
Деление |
% |
Остаток от деления |
$a = 15
$b = 10
$c = $a + $b # Сложение
$d = $a - $b # Вычитание
$e = $a * $b # Умножение
$f = $a / $b # Деление
$g = $a % $b # Остаток от деления
Write-Output $c
Write-Output $d
Write-Output $e
Write-Output $f
Write-Output $g
Операторы сравнения
Используются для проверки условий. В таблице ниже перечислены все операторы сравнения, доступные в PowerShell:
Оператор |
Описание |
-eq |
Равно |
-ne |
Не равно |
-gt |
Больше |
-ge |
Больше или равно |
-lt |
Меньше |
-le |
Меньше или равно |
$c = 25
$d = 45
$c -eq $d # Равно (Equal)
$c -ne $d # Не равно (Not Equal)
$c -gt $d # Больше (Greater Than)
$c -lt $d # Меньше (Less Than)
$c -ge $d # Больше или равно (Greater or Equal)
$c -le $d # Меньше или равно (Less or Equal)
Логические операторы
Применяются в условиях. В таблице ниже перечислены все логические операторы, доступные в PowerShell:
Оператор |
Описание |
-and |
Логическое И |
-or |
Логическое ИЛИ |
-not или ! |
Логическое НЕ |
($a -gt 5) -and ($b -lt 10) # Логическое "И"
($a -gt 5) -or ($b -gt 10) # Логическое "ИЛИ"
-not ($a -eq $b) # Логическое "НЕ"
Условные конструкции
Условные конструкции в PowerShell — это механизмы, позволяющие выполнять код в зависимости от выполнения определенных условий. Они позволяют программе принимать решения, что делает скрипты более гибкими в использовании.
Операторы if elseif else
Используются для выполнения кода в зависимости от условия. Рассмотрим использование операторов на примере ниже:
$number = 10
if ($number -gt 5) {
Write-Output "Число больше 5"
} elseif ($number -eq 5) {
Write-Output "Число равно 5"
} else {
Write-Output "Число меньше 5"
}
Циклы
Циклы используются для повторного выполнения блока кода, пока выполняется определенное условие. В PowerShell есть несколько видов циклов:
for
— классический цикл с итератором.foreach
— перебирает элементы массива или коллекции.while
— выполняется, пока условие истинно.do-while
— выполняется хотя бы один раз, затем проверяет условие.do-until
— выполняется, пока условие ложно.
Цикл for
Используется, когда известно количество итераций.
for ($i=0; $i -lt 5; $i++) {
Write-Output "Итерация $i"
}
Цикл while
Выполняется, пока условие остается True (пока условие истинно).
$count = 0
while ($count -lt 3) {
Write-Output "Счетчик: $count"
$count++
}
Цикл foreach
Используется для перебора элементов массива.
$numbers = @(1,2,3,4,5)
foreach ($num in $numbers) {
Write-Output "Число: $num"
}
Цикл do-while
Гарантирует хотя бы одну итерацию (сначала выполняет, потом проверяет).
$i = 0
do {
Write-Output "Число $i"
$i++
} while ($i -lt 5)
Цикл do-until
Выполняется до тех пор, пока условие не станет True.
$i = 1
do {
Write-Output "Итерация: $i"
$i++
} until ($i -gt 3)
Функции
Функции в PowerShell позволяют объединять блоки кода и многократно их использовать. Они могут принимать параметры и возвращать значения.
Функции создаются с помощью ключевого слова function
:
function SayHello {
Write-Output "Привет, PowerShell!"
}
SayHello
Функция с параметром
function Greet($name) {
Write-Output "Привет, $name!"
}
Greet "Иван"
Функция с несколькими параметрами
function SumNumbers($a, $b) {
return $a + $b
}
$result = SumNumbers 5 10
Write-Output "Сумма: $result"
Работа с файлами и директориями
PowerShell отлично подходит для работы с файлами и директориями. Рассмотрим некоторые полезные команды для работы в ОС Windows.
- Получение списка файлов
Get-ChildItem C:\Users
- Создание папки
New-Item -Path "C:\TestFolder" -ItemType Directory
- Создание файла
New-Item -Path "C:\TestFolder\file.txt" -ItemType File
- Запись в файл
Set-Content -Path "C:\TestFolder\file.txt" -Value "Hello, world!"
- Чтение файла
Get-Content "C:\TestFolder\file.txt"
- Копирование файла
Copy-Item -Path "C:\TestFolder\file.txt" -Destination "C:\Users\file.txt"
- Перемещение файла
Для выполнения команды ниже PowerShell необходимо запустить с правами администратора, иначе при выполнении будет ошибка.
Move-Item -Path "C:\TestFolder\file.txt" -Destination "C:\Windows\file.txt"
- Удаление файла
Remove-Item -Path "C:\TestFolder\file.txt"
Работа с процессами и службами
- Получение списка процессов
Get-Process
- Завершение процесса
Например, завершим процесс «Блокнот»:
Stop-Process -Name notepad -Force
- Получение списка служб
Get-Service
- Запуск службы
Для примера запустим службу wuauserv
:
Start-Service -Name wuauserv
- Остановка службы
Stop-Service -Name wuauserv
Автоматизация задач с помощью PowerShell
PowerShell идеально подходит для автоматизации многих задач в Windows. Рассмотрим несколько примеров.
Мониторинг процесса и его автоматический перезапуск
Первая задача, которую мы рассмотрим, заключается в отслеживании процесса и его автоматическом перезапуске, если он перестанет отвечать:
$processName = "notepad"
while ($true) {
if (-not (Get-Process -Name $processName -ErrorAction SilentlyContinue)) {
Write-Output "$processName не работает! Перезапуск..."
Start-Process $processName
}
Start-Sleep -Seconds 10
}
Скрипт выше проверяет, запущен ли процесс notepad
(«Блокнот»). Если процесс не найден, то запускает его и проверяет его статус каждые 10 секунд.
Удаление старых файлов
Удаление старых и неактуальных файлов может освободить место на диске. В примере ниже скрипт удаляет файлы, которые старше одного дня, в директории C:\TestFolder
:
$folder = "C:\TestFolder"
$days = 1
$limit = (Get-Date).AddDays(-$days)
Get-ChildItem -Path $folder -Recurse | Where-Object { $_.LastWriteTime -lt $limit } | Remove-Item -Force
Write-Output "Удалены файлы старше $days дней"
Запуск процесса по расписанию
Настроим автоматический запуск программы «Блокнот» каждый день в 9:00 утра:
$action = New-ScheduledTaskAction -Execute "notepad.exe"
$trigger = New-ScheduledTaskTrigger -Daily -At 9am
Register-ScheduledTask -TaskName "OpenNotepad" -Action $action -Trigger $trigger
Write-Output "Задача добавлена в планировщик!"
Безопасность в PowerShell
PowerShell обладает встроенным функционалом по обеспечению безопасности. Рассмотрим его более подробно.
Политики выполнения (Execution Policies)
По умолчанию PowerShell блокирует выполнение скриптов. Чтобы проверить текущую политику, необходимо использовать команду:
Get-ExecutionPolicy
Типы политик встроенных в PowerShell:
Restricted
— Запрещено выполнять скрипты (по умолчанию).AllSigned
— Разрешает только подписанные скрипты.RemoteSigned
— Локальные скрипты выполняются, загруженные из сети должны быть подписаны.Unrestricted
— Можно запускать любые скрипты, но при запуске загруженных файлов появляется предупреждение.Bypass
— Полностью отключает защиту (НЕ рекомендуется).
Для изменения политики требуются права администратора. Команда для изменения следующая:
Set-ExecutionPolicy Unrestricted
Подписание скриптов
Чтобы предотвратить запуск вредоносного кода в скриптах, в PowerShell присутствует возможность подписания скриптов.
Заранее создаем тестовый скрипт в директории C:\TestFolder
со следующим содержимым:
$path = "C:\Users"
if (Test-Path $path) {
try {
Get-ChildItem -Path $path -Force
} catch {
Write-Host "Access denied to $path"
}
} else {
Write-Host "The path does not exist: $path"
}
Сохраняем файл с именем и расширением script.ps1
.
Далее подписываем скрипт:
- Создаем самоподписанный сертификат:
New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyPowerShellCert" -KeyUsage DigitalSignature -KeySpec Signature -NotAfter (Get-Date).AddYears(5) -CertStoreLocation "Cert:\CurrentUser\My"
- Выведем данные сертификата. В частности, нам необходим его Thumbprint (отпечаток), который пригодится далее.
Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
- Теперь необходимо добавить сгенерированный сертификат в папку корневых сертификатов. Открываем «Диспетчер сертификатов» через PowerShell:
certmgr.msc
- Переходим в раздел «Personal» (сертификаты пользователя), кликаем по нужному сертификату правой кнопкой мыши и выбираем пункт «Export» (Экспорт):
- В открывшемся меню нажимаем на кнопку «Next». Выбираем параметр «Не экспортировать закрытый ключ»:
Выбираем формат Base-64:
Нажимаем «Next».
Дальше нажимаем на кнопку «Browse» и выбираем директорию, куда будет сохранен сертификат.
Нажимаем «Finish», чтобы завершить экспорт.
- Открываем сертификат и нажимаем на кнопку «Install Certificate...»:
Выбираем пункт для текущего пользователя:
Для установки в конкретное хранилище сертификатов выбираем пункт «Place all certificates in the following store»:
Выбираем «Trusted Root Certification Authorities»:
Завершаем установку сертификата нажатием на кнопку «Finish».
- При появлении окна с предупреждением нажимаем «Yes»:
- Подписываем скрипт
script.ps1
, размещенный в директорииC:\TestFolder.
Для этого вводим ранее полученный отпечаток после опцииThumbprint -eq
.
$cert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "B8D1657CD8D09A2B80BEFEEF378C17DA2FE41352" }
Set-AuthenticodeSignature -FilePath "C:\TestFolder\script.ps1" -Certificate $cert
- Проверяем, что скрипт был успешно подписан:
Get-AuthenticodeSignature -FilePath "C:\TestFolder\script.ps1"
Подпись был успешно создана.
- Запустим скрипт:
Теперь попробуем запустить неподписанный скрипт при использовании политики AllSigned
, разрешающей запуск только подписанных скриптов.
Меняем политику на AllSigned
:
Set-ExecutionPolicy AllSigned -Scope CurrentUser
Создаем новый скрипт и попытаемся его запустить:
Система вернула ошибку, так как скрипт не подписан.
Надежные VDS/VPS для ваших проектов
Заключение
Сегодня мы познакомились с командной оболочкой PowerShell и ее синтаксисом. PowerShell — это мощный инструмент автоматизации в операционных системах Windows, который упрощает работу со множеством задач от создания резервных копий до планировщика задач и работы с файлами.