Первые версии 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, базами данных и облачными сервисами.
Установка PowerShell на Windows
Несмотря на то, что командная строка (cmd) и Powershell уже предустановлены во всех последних версиях Windows, PowerShell можно установить отдельно.
Отдельная установка может понадобиться, если предустановленная версия отличается от последней доступной актуальной версии.
Установить PowerShell в ОС Windows можно тремя разными способами:
- Через Microsoft Store (только для ОС Windows 10 и Windows 11).
- При помощи установочного файла с расширением
.msi. - С помощью утилиты
winget(wingetдолжен быть установлен отдельно).
- Microsoft Store
- MSI-пакет
- winget
Данный метод установки поддерживается только на Windows 10 и Windows 11. Процесс установки для двух дистрибутивов идентичен.
- Запускаем приложение Microsoft Store и в поиске вводим «powershell». Существует 2 версии PowerShell — Обычная (стабильная) и Preview. Версия Preview является тестовой и может содержать ошибки, однако она позволяет ознакомиться с новым функционалом, который еще не доступен в обычной (стабильной) версии.
Мы установим обычную стабильную версию:

Приложение PowerShell в Microsoft Store
- Для установки нажимаем на кнопку «Получить» и дожидаемся завершения установочного процесса:

Приложение PowerShell в Microsoft Store
Для запуска введите «powershell» в поиске Windows.
Также стоит обратить внимание, что при установке старая версия PowerShell не будет удалена. Чтобы отличить новую установленную версию от старой, достаточно посмотреть на имя приложения — новая версия называется PowerShell, а старая версия (она же предустановленная) называется Windows PowerShell:

Приложение Windows PowerShell в поиске ОС WindowsОсновы работы с 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

Окно Windows PowerShell в интерфейсе ОС Windows
Для вывода значения переменной используется оператор Write-Output:
Write-Output $myvar1 Write-Output $myvar2

Окно Windows PowerShell в интерфейсе ОС Windows
PowerShell автоматически определяет тип данных, но при желании его можно задавать явно:
[string]$myvar1 = “This is string variable”
[int]$myvar2 = 32

Окно Windows PowerShell в интерфейсе ОС Windows
Помимо хранения строковых и числовых данных, в переменных можно хранить массивы и хэш-таблицы (они же словари).
Создадим переменную var-array, в которой будет храниться массив цифр от 1 до 5:
$var_array = @(1, 2, 3, 4, 5)
Чтобы вывести значения объектов, хранящихся в массиве, необходимо написать имя переменной и в квадратных скобках указать порядковый номер объекта. Как и в других языках программирования, счет объектов начинается с 0, поэтому для вывода цифры 1 необходимо ввести 0:
$var_array[0]

Окно Windows PowerShell в интерфейсе ОС Windows
Создадим другую переменную с именем var-hash, в которой будет храниться хэш-таблица или словарь данных. Структура данных имеет вид: Ключ: Значение.
$var_hash = @{ "ID" = 1; "Name" = "Alex" }
Для вывода значений необходимо указать имя переменной и ключ, например:
$var_hash["Name"]

Окно Windows PowerShell в интерфейсе ОС Windows
Также с переменными можно производить различные арифметические операции, например, сложение:
$first_num = 20
$second_num = 30
$sum = $first_num + $second_num
Write-Output $sum

Окно Windows PowerShell в интерфейсе ОС Windows
Операторы
В 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

Окно Windows PowerShell в интерфейсе ОС Windows
Операторы сравнения
Используются для проверки условий. В таблице ниже перечислены все операторы сравнения, доступные в 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)

Окно Windows PowerShell в интерфейсе ОС Windows
Логические операторы
Применяются в условиях. В таблице ниже перечислены все логические операторы, доступные в PowerShell:
|
Оператор |
Описание |
|
-and |
Логическое И |
|
-or |
Логическое ИЛИ |
|
-not или ! |
Логическое НЕ |
($a -gt 5) -and ($b -lt 10) # Логическое "И"
($a -gt 5) -or ($b -gt 10) # Логическое "ИЛИ"
-not ($a -eq $b) # Логическое "НЕ"

Окно Windows PowerShell в интерфейсе ОС Windows
Условные конструкции
Условные конструкции в PowerShell — это механизмы, позволяющие выполнять код в зависимости от выполнения определенных условий. Они позволяют программе принимать решения, что делает скрипты более гибкими в использовании.
Операторы if elseif else
Используются для выполнения кода в зависимости от условия. Рассмотрим использование операторов на примере ниже:
$number = 10
if ($number -gt 5) {
Write-Output "Число больше 5"
} elseif ($number -eq 5) {
Write-Output "Число равно 5"
} else {
Write-Output "Число меньше 5"
}

Окно Windows PowerShell в интерфейсе ОС Windows
Циклы
Циклы используются для повторного выполнения блока кода, пока выполняется определенное условие. В PowerShell есть несколько видов циклов:
for— классический цикл с итератором.foreach— перебирает элементы массива или коллекции.while— выполняется, пока условие истинно.do-while— выполняется хотя бы один раз, затем проверяет условие.do-until— выполняется, пока условие ложно.
Цикл for
Используется, когда известно количество итераций.
for ($i=0; $i -lt 5; $i++) { Write-Output "Итерация $i" }

Окно Windows PowerShell в интерфейсе ОС Windows
Цикл while
Выполняется, пока условие остается True (пока условие истинно).
$count = 0
while ($count -lt 3) {
Write-Output "Счетчик: $count"
$count++
}

Окно Windows PowerShell в интерфейсе ОС Windows
Цикл foreach
Используется для перебора элементов массива.
$numbers = @(1,2,3,4,5)
foreach ($num in $numbers) {
Write-Output "Число: $num"
}

Окно Windows PowerShell в интерфейсе ОС Windows
Цикл do-while
Гарантирует хотя бы одну итерацию (сначала выполняет, потом проверяет).
$i = 0
do {
Write-Output "Число $i"
$i++
} while ($i -lt 5)

Окно Windows PowerShell в интерфейсе ОС Windows
Цикл do-until
Выполняется до тех пор, пока условие не станет True.
$i = 1
do {
Write-Output "Итерация: $i"
$i++
} until ($i -gt 3)

Окно Windows PowerShell в интерфейсе ОС Windows
Функции
Функции в PowerShell позволяют объединять блоки кода и многократно их использовать. Они могут принимать параметры и возвращать значения.
Функции создаются с помощью ключевого слова function:
function SayHello { Write-Output "Привет, PowerShell!" } SayHello

Окно Windows PowerShell в интерфейсе ОС Windows
Функция с параметром
function Greet($name) { Write-Output "Привет, $name!" } Greet "Иван"

Окно Windows PowerShell в интерфейсе ОС Windows
Функция с несколькими параметрами
function SumNumbers($a, $b) {
return $a + $b
}
$result = SumNumbers 5 10
Write-Output "Сумма: $result"

Окно Windows PowerShell в интерфейсе ОС Windows
Работа с файлами и директориями
PowerShell отлично подходит для работы с файлами и директориями. Рассмотрим некоторые полезные команды для работы в ОС Windows.
- Получение списка файлов
Get-ChildItem C:\Users

Окно Windows PowerShell в интерфейсе ОС Windows
- Создание папки
New-Item -Path "C:\TestFolder" -ItemType Directory

Окно Windows PowerShell в интерфейсе ОС Windows
- Создание файла
New-Item -Path "C:\TestFolder\file.txt" -ItemType File

Окно Windows PowerShell в интерфейсе ОС Windows
- Запись в файл
Set-Content -Path "C:\TestFolder\file.txt" -Value "Hello, world!"

Окно Windows PowerShell в интерфейсе ОС Windows
- Чтение файла
Get-Content "C:\TestFolder\file.txt"

Окно Windows PowerShell в интерфейсе ОС Windows
- Копирование файла
Copy-Item -Path "C:\TestFolder\file.txt" -Destination "C:\Users\file.txt"

Окно Windows PowerShell в интерфейсе ОС Windows
- Перемещение файла
Для выполнения команды ниже PowerShell необходимо запустить с правами администратора, иначе при выполнении будет ошибка.
Move-Item -Path "C:\TestFolder\file.txt" -Destination "C:\Windows\file.txt"

Окно Windows PowerShell в интерфейсе ОС Windows
- Удаление файла
Remove-Item -Path "C:\TestFolder\file.txt"

Окно Windows PowerShell в интерфейсе ОС Windows
Работа с процессами и службами
- Получение списка процессов
Get-Process

Окно Windows PowerShell в интерфейсе ОС Windows
- Завершение процесса
Например, завершим процесс «Блокнот»:
Stop-Process -Name notepad -Force

Окно Windows PowerShell в интерфейсе ОС Windows
- Получение списка служб
Get-Service

Окно Windows PowerShell в интерфейсе ОС Windows
- Запуск службы
Для примера запустим службу wuauserv:
Start-Service -Name wuauserv

Окно Windows PowerShell в интерфейсе ОС Windows
- Остановка службы
Stop-Service -Name wuauserv

Окно Windows PowerShell в интерфейсе ОС Windows
Автоматизация задач с помощью 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
}

Окно Windows PowerShell в интерфейсе ОС Windows
Скрипт выше проверяет, запущен ли процесс 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 дней"

Окно Windows PowerShell в интерфейсе ОС Windows
Запуск процесса по расписанию
Настроим автоматический запуск программы «Блокнот» каждый день в 9:00 утра:
$action = New-ScheduledTaskAction -Execute "notepad.exe"
$trigger = New-ScheduledTaskTrigger -Daily -At 9am
Register-ScheduledTask -TaskName "OpenNotepad" -Action $action -Trigger $trigger
Write-Output "Задача добавлена в планировщик!"

Окно Windows PowerShell в интерфейсе ОС Windows
Безопасность в PowerShell
PowerShell обладает встроенным функционалом по обеспечению безопасности. Рассмотрим его более подробно.
Политики выполнения (Execution Policies)
По умолчанию PowerShell блокирует выполнение скриптов. Чтобы проверить текущую политику, необходимо использовать команду:
Get-ExecutionPolicy

Окно Windows PowerShell в интерфейсе ОС Windows
Типы политик встроенных в PowerShell:
Restricted— Запрещено выполнять скрипты (по умолчанию).AllSigned— Разрешает только подписанные скрипты.RemoteSigned— Локальные скрипты выполняются, загруженные из сети должны быть подписаны.Unrestricted— Можно запускать любые скрипты, но при запуске загруженных файлов появляется предупреждение.Bypass— Полностью отключает защиту (НЕ рекомендуется).
Для изменения политики требуются права администратора. Команда для изменения следующая:
Set-ExecutionPolicy Unrestricted

Окно Windows PowerShell в интерфейсе ОС Windows
Подписание скриптов
Чтобы предотвратить запуск вредоносного кода в скриптах, в 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"

Окно Windows PowerShell в интерфейсе ОС Windows
- Выведем данные сертификата. В частности, нам необходим его Thumbprint (отпечаток), который пригодится далее.
Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert

Окно Windows PowerShell в интерфейсе ОС Windows
- Теперь необходимо добавить сгенерированный сертификат в папку корневых сертификатов. Открываем «Диспетчер сертификатов» через PowerShell:
certmgr.msc

Окна Windows PowerShell и «Диспетчер сертификатов» в интерфейсе ОС Windows
- Переходим в раздел «Personal» (сертификаты пользователя), кликаем по нужному сертификату правой кнопкой мыши и выбираем пункт «Export» (Экспорт):

Окна Windows PowerShell и «Диспетчер сертификатов» в интерфейсе ОС Windows
- В открывшемся меню нажимаем на кнопку «Next». Выбираем параметр «Не экспортировать закрытый ключ»:

Окно Certificate Export Wizard в интерфейсе ОС Windows
Выбираем формат Base-64:

Окно Certificate Export Wizard в интерфейсе ОС Windows
Нажимаем «Next».
Дальше нажимаем на кнопку «Browse» и выбираем директорию, куда будет сохранен сертификат.
Нажимаем «Finish», чтобы завершить экспорт.
- Открываем сертификат и нажимаем на кнопку «Install Certificate...»:

Окно Certificate в интерфейсе ОС Windows
Выбираем пункт для текущего пользователя:

Окно Certificate Export Wizard в интерфейсе ОС Windows
Для установки в конкретное хранилище сертификатов выбираем пункт «Place all certificates in the following store»:

Окно Certificate Export Wizard в интерфейсе ОС Windows
Выбираем «Trusted Root Certification Authorities»:

Окно Select Certificate Store в интерфейсе ОС Windows
Завершаем установку сертификата нажатием на кнопку «Finish».
- При появлении окна с предупреждением нажимаем «Yes»:

Окно Security Warning в интерфейсе ОС Windows
- Подписываем скрипт
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"

Окно Windows PowerShell в интерфейсе ОС Windows
Подпись был успешно создана.
- Запустим скрипт:

Окно Windows PowerShell в интерфейсе ОС Windows
Теперь попробуем запустить неподписанный скрипт при использовании политики AllSigned, разрешающей запуск только подписанных скриптов.
Меняем политику на AllSigned:
Set-ExecutionPolicy AllSigned -Scope CurrentUser
Создаем новый скрипт и попытаемся его запустить:

Окно Windows PowerShell в интерфейсе ОС Windows
Система вернула ошибку, так как скрипт не подписан.
Надежные VDS/VPS для ваших проектов
900 ₽/мес
1 080 ₽/мес
Заключение
Сегодня мы познакомились с командной оболочкой PowerShell и ее синтаксисом. PowerShell — это мощный инструмент автоматизации в операционных системах Windows, который упрощает работу со множеством задач от создания резервных копий до планировщика задач и работы с файлами.

