Top.Mail.Ru
Публичное облако на базе VMware с управлением через vCloud Director
Вход / Регистрация

Windows PowerShell: принципы работы и основные возможности

Александр Бархатов
Александр Бархатов
Технический писатель
26 февраля 2025 г.
122
20 минут чтения
Средний рейтинг статьи: 3

Первые версии 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 и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа

Установка 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. Процесс установки для двух дистрибутивов идентичен.

  1. Запускаем приложение Microsoft Store и в поиске вводим «powershell». Существует 2 версии PowerShell — Обычная (стабильная) и Preview. Версия Preview является тестовой и может содержать ошибки, однако она позволяет ознакомиться с новым функционалом, который еще не доступен в обычной (стабильной) версии. 

Мы установим обычную стабильную версию:

Image11

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

Image21

Для запуска введите «powershell» в поиске Windows.

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

Image3

Основы работы с 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

Image54

Для вывода значения переменной используется оператор Write-Output:

  
Write-Output $myvar1 Write-Output $myvar2

Image47

PowerShell автоматически определяет тип данных, но при желании его можно задавать явно:

  
[string]$myvar1 = “This is string variable” [int]$myvar2 = 32

Image36

Помимо хранения строковых и числовых данных, в переменных можно хранить массивы и хэш-таблицы (они же словари).

Создадим переменную var-array, в которой будет храниться массив цифр от 1 до 5:

  
$var_array = @(1, 2, 3, 4, 5)

Чтобы вывести значения объектов, хранящихся в массиве, необходимо написать имя переменной и в квадратных скобках указать порядковый номер объекта. Как и в других языках программирования, счет объектов начинается с 0, поэтому для вывода цифры 1 необходимо ввести 0:

  
$var_array[0]

Image48

Создадим другую переменную с именем var-hash, в которой будет храниться хэш-таблица или словарь данных. Структура данных имеет вид: Ключ: Значение.

  
$var_hash = @{ "ID" = 1; "Name" = "Alex" }

Для вывода значений необходимо указать имя переменной и ключ, например:

  
$var_hash["Name"]

Image29

Также с переменными можно производить различные арифметические операции, например, сложение:

  
$first_num = 20 $second_num = 30 $sum = $first_num + $second_num Write-Output $sum

Image37

Операторы

В 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

Image53

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

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

Image49

Логические операторы

Применяются в условиях. В таблице ниже перечислены все логические операторы, доступные в PowerShell:

Оператор

Описание

-and

Логическое И

-or

Логическое ИЛИ

-not или !

Логическое НЕ

  
($a -gt 5) -and ($b -lt 10) # Логическое "И" ($a -gt 5) -or ($b -gt 10) # Логическое "ИЛИ" -not ($a -eq $b) # Логическое "НЕ"

Image43

Условные конструкции

Условные конструкции в PowerShell — это механизмы, позволяющие выполнять код в зависимости от выполнения определенных условий. Они позволяют программе принимать решения, что делает скрипты более гибкими в использовании.

Операторы if elseif else

Используются для выполнения кода в зависимости от условия. Рассмотрим использование операторов на примере ниже:

  
$number = 10 if ($number -gt 5) { Write-Output "Число больше 5" } elseif ($number -eq 5) { Write-Output "Число равно 5" } else { Write-Output "Число меньше 5" }

Image24

Циклы

Циклы используются для повторного выполнения блока кода, пока выполняется определенное условие. В PowerShell есть несколько видов циклов:

  • for — классический цикл с итератором.
  • foreach — перебирает элементы массива или коллекции.
  • while — выполняется, пока условие истинно.
  • do-while — выполняется хотя бы один раз, затем проверяет условие.
  • do-until — выполняется, пока условие ложно.

Цикл for

Используется, когда известно количество итераций.

  
for ($i=0; $i -lt 5; $i++) { Write-Output "Итерация $i" }

Image61

Цикл while

Выполняется, пока условие остается True (пока условие истинно).

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

Image38

Цикл foreach

Используется для перебора элементов массива.

  
$numbers = @(1,2,3,4,5) foreach ($num in $numbers) { Write-Output "Число: $num" }

Image50

Цикл do-while

Гарантирует хотя бы одну итерацию (сначала выполняет, потом проверяет).

  
$i = 0 do { Write-Output "Число $i" $i++ } while ($i -lt 5)

Image20

Цикл do-until

Выполняется до тех пор, пока условие не станет True.

  
$i = 1 do { Write-Output "Итерация: $i" $i++ } until ($i -gt 3)

Image28

Функции

Функции в PowerShell позволяют объединять блоки кода и многократно их использовать. Они могут принимать параметры и возвращать значения. 

Функции создаются с помощью ключевого слова function:

  
function SayHello { Write-Output "Привет, PowerShell!" } SayHello

Image31

Функция с параметром

  
function Greet($name) { Write-Output "Привет, $name!" } Greet "Иван"

Image64

Функция с несколькими параметрами

  
function SumNumbers($a, $b) { return $a + $b } $result = SumNumbers 5 10 Write-Output "Сумма: $result"

Image34

Работа с файлами и директориями

PowerShell отлично подходит для работы с файлами и директориями. Рассмотрим некоторые полезные команды для работы в ОС Windows.

  • Получение списка файлов
  
Get-ChildItem C:\Users

Image7

  • Создание папки
  
New-Item -Path "C:\TestFolder" -ItemType Directory

Image9

  • Создание файла
  
New-Item -Path "C:\TestFolder\file.txt" -ItemType File

Image10

  • Запись в файл
  
Set-Content -Path "C:\TestFolder\file.txt" -Value "Hello, world!"

Image5

  • Чтение файла
  
Get-Content "C:\TestFolder\file.txt"

Image57

  • Копирование файла
  
Copy-Item -Path "C:\TestFolder\file.txt" -Destination "C:\Users\file.txt"

Image6

  • Перемещение файла

Для выполнения команды ниже PowerShell необходимо запустить с правами администратора, иначе при выполнении будет ошибка.

  
Move-Item -Path "C:\TestFolder\file.txt" -Destination "C:\Windows\file.txt"

Image41

  • Удаление файла
  
Remove-Item -Path "C:\TestFolder\file.txt"

Image46

Работа с процессами и службами

  • Получение списка процессов
  
Get-Process

Image26

  • Завершение процесса

Например, завершим процесс «Блокнот»:

  
Stop-Process -Name notepad -Force

Image8

  • Получение списка служб
  
Get-Service

Image27

  • Запуск службы 

Для примера запустим службу wuauserv:

  
Start-Service -Name wuauserv

Image65

  • Остановка службы
  
Stop-Service -Name wuauserv

Image25

Автоматизация задач с помощью 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 }

Image32

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

Image30

Запуск процесса по расписанию

Настроим автоматический запуск программы «Блокнот» каждый день в 9:00 утра:

  
$action = New-ScheduledTaskAction -Execute "notepad.exe" $trigger = New-ScheduledTaskTrigger -Daily -At 9am Register-ScheduledTask -TaskName "OpenNotepad" -Action $action -Trigger $trigger Write-Output "Задача добавлена в планировщик!"

Image55

Безопасность в PowerShell

PowerShell обладает встроенным функционалом по обеспечению безопасности. Рассмотрим его более подробно.

Политики выполнения (Execution Policies)

По умолчанию PowerShell блокирует выполнение скриптов. Чтобы проверить текущую политику, необходимо использовать команду:

  
Get-ExecutionPolicy

Image16

Типы политик встроенных в PowerShell:

  • Restricted — Запрещено выполнять скрипты (по умолчанию).
  • AllSigned — Разрешает только подписанные скрипты.
  • RemoteSigned — Локальные скрипты выполняются, загруженные из сети должны быть подписаны.
  • Unrestricted — Можно запускать любые скрипты, но при запуске загруженных файлов появляется предупреждение.
  • Bypass — Полностью отключает защиту (НЕ рекомендуется).

Для изменения политики требуются права администратора. Команда для изменения следующая:

  
Set-ExecutionPolicy Unrestricted 

Image15

Подписание скриптов

Чтобы предотвратить запуск вредоносного кода в скриптах, в 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.

Далее подписываем скрипт:

  1. Создаем самоподписанный сертификат:
  
New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyPowerShellCert" -KeyUsage DigitalSignature -KeySpec Signature -NotAfter (Get-Date).AddYears(5) -CertStoreLocation "Cert:\CurrentUser\My"

Image56

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

Image1

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

Image45

  1. Переходим в раздел «Personal» (сертификаты пользователя), кликаем по нужному сертификату правой кнопкой мыши и выбираем пункт «Export» (Экспорт):

Image67

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

Image22

Выбираем формат Base-64:

Image44

Нажимаем «Next».

Дальше нажимаем на кнопку «Browse» и выбираем директорию, куда будет сохранен сертификат.

Нажимаем «Finish», чтобы завершить экспорт.

  1. Открываем сертификат и нажимаем на кнопку «Install Certificate...»:

Image18

Выбираем пункт для текущего пользователя:

Image63

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

Image52

Выбираем «Trusted Root Certification Authorities»:

Image66

Завершаем установку сертификата нажатием на кнопку «Finish».

  1. При появлении окна с предупреждением нажимаем «Yes»:

Image35

  1. Подписываем скрипт 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

Image33

  1. Проверяем, что скрипт был успешно подписан:
  
Get-AuthenticodeSignature -FilePath "C:\TestFolder\script.ps1"

Image2

Подпись был успешно создана.

  1. Запустим скрипт:

Image14

Теперь попробуем запустить неподписанный скрипт при использовании политики AllSigned, разрешающей запуск только подписанных скриптов. 

Меняем политику на AllSigned:

  
Set-ExecutionPolicy AllSigned -Scope CurrentUser

Создаем новый скрипт и попытаемся его запустить:

Image40

Система вернула ошибку, так как скрипт не подписан.

Надежные VDS/VPS для ваших проектов

  • Premium 3.3 ГГц
  • High CPU 5.5 ГГц
  • Dedicated CPU
Москва
Cloud MSK 15

300 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

550 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

Сегодня мы познакомились с командной оболочкой PowerShell и ее синтаксисом. PowerShell — это мощный инструмент автоматизации в операционных системах Windows, который упрощает работу со множеством задач от создания резервных копий до планировщика задач и работы с файлами. 

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
26 февраля 2025 г.
122
20 минут чтения
Средний рейтинг статьи: 3
Ваш комментарий
Поддерживается разметка Markdown
Пока нет комментариев
Произошла неизвестная ошибка
Мы используем на сайте куки.
В интернете без них никак