Первые версии Linux- и Unix-дистрибутивов традиционно управлялись при помощи командной строки. Несмотря на то, что со временем были выпущены различные графические оболочки, такие как GNOME, KDE, Cinnamon, XFCE, Linux стал прочно ассоциироваться с управлением через терминал. В то же время операционные системы семейства Windows ассоциируются именно с использованием графического интерфейса. Однако, существует способ, при котором можно управлять ОС Windows из командной оболочки, — с помощью инструмента PowerShell. Сегодня мы рассмотрим синтаксис и основы работы с PowerShell.
PowerShell — это мощная кросс-платформенная среда автоматизации и управления конфигурациями, разработанная корпорацией Microsoft. PowerShell объединяет в себе командную оболочку и язык сценариев, что позволяет выполнять административные задачи, автоматизировать процессы и управлять системой Windows.
История PowerShell берет свои корни в начале 2000-х годов, когда Microsoft решила создать более мощную и продвинутую командную оболочку для Windows, взамен устаревшей cmd
.
В 2002 году Microsoft предложила концепцию объектно-ориентированной оболочки, которая должна была заменить командный процессор Windows. Так родился проект Monad. Среди ключевых особенностей Monad можно выделить следующие:
Впервые широкой публике 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 основных релизов:
На момент написания статьи актуальной является версия 7.5.0.
Архитектура PowerShell основана на следующих компонентах:
Представляет собой интерактивную командную строку, где пользователь может вводить команды для управления операционной системой и ее объектами.
PowerShell использует свой собственный язык сценариев, который сочетает в себе возможности командной строки и полноценного языка программирования. Язык сценариев поддерживает переменные, циклы, условия, функции и модули.
PowerShell построен на модульной платформе .NET, что позволяет ему взаимодействовать с объектами .NET и использовать их методы и свойства.
Модули — это пакеты, содержащие команды и функции. Позволяют расширять функциональность PowerShell. Провайдеры — это компоненты, которые предоставляют доступ к данным в различных хранилищах (например, файловая система, реестр, переменные среды).
Принцип работы PowerShell основан на объектно-ориентированном подходе — в отличие от традиционных командных оболочек, которые работают с текстом, PowerShell работает с объектами. Каждая команда возвращает объект, который содержит свойства и методы. Это позволяет легко обрабатывать данные, передавать их между командами и использовать в скриптах.
Одной из мощных особенностей PowerShell является возможность передачи вывода одной команды (объектов) непосредственно в другую с помощью символа |
. Благодаря этому можно строить цепочки команд, где каждая команда обрабатывает или преобразует объекты, которые передаются дальше по цепочке.
Несмотря на схожесть, 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, базами данных и облачными сервисами.
Несмотря на то, что командная строка (cmd) и Powershell уже предустановлены во всех последних версиях Windows, PowerShell можно установить отдельно.
Отдельная установка может понадобиться, если предустановленная версия отличается от последней доступной актуальной версии.
Установить PowerShell в ОС Windows можно тремя разными способами:
.msi
.winget
(winget
должен быть установлен отдельно).Данный метод установки поддерживается только на Windows 10 и Windows 11. Процесс установки для двух дистрибутивов идентичен.
Мы установим обычную стабильную версию:
Для запуска введите «powershell» в поиске Windows.
Также стоит обратить внимание, что при установке старая версия PowerShell не будет удалена. Чтобы отличить новую установленную версию от старой, достаточно посмотреть на имя приложения — новая версия называется PowerShell, а старая версия (она же предустановленная) называется Windows PowerShell:
Рассмотрим синтаксис PowerShell и работу с командлетами (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 — это механизмы, позволяющие выполнять код в зависимости от выполнения определенных условий. Они позволяют программе принимать решения, что делает скрипты более гибкими в использовании.
Используются для выполнения кода в зависимости от условия. Рассмотрим использование операторов на примере ниже:
$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 ($i=0; $i -lt 5; $i++) { Write-Output "Итерация $i" }
Выполняется, пока условие остается True (пока условие истинно).
$count = 0
while ($count -lt 3) {
Write-Output "Счетчик: $count"
$count++
}
Используется для перебора элементов массива.
$numbers = @(1,2,3,4,5)
foreach ($num in $numbers) {
Write-Output "Число: $num"
}
Гарантирует хотя бы одну итерацию (сначала выполняет, потом проверяет).
$i = 0
do {
Write-Output "Число $i"
$i++
} while ($i -lt 5)
Выполняется до тех пор, пока условие не станет 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 идеально подходит для автоматизации многих задач в 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 блокирует выполнение скриптов. Чтобы проверить текущую политику, необходимо использовать команду:
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"
Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
certmgr.msc
Выбираем формат Base-64:
Нажимаем «Next».
Дальше нажимаем на кнопку «Browse» и выбираем директорию, куда будет сохранен сертификат.
Нажимаем «Finish», чтобы завершить экспорт.
Выбираем пункт для текущего пользователя:
Для установки в конкретное хранилище сертификатов выбираем пункт «Place all certificates in the following store»:
Выбираем «Trusted Root Certification Authorities»:
Завершаем установку сертификата нажатием на кнопку «Finish».
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
Создаем новый скрипт и попытаемся его запустить:
Система вернула ошибку, так как скрипт не подписан.
Сегодня мы познакомились с командной оболочкой PowerShell и ее синтаксисом. PowerShell — это мощный инструмент автоматизации в операционных системах Windows, который упрощает работу со множеством задач от создания резервных копий до планировщика задач и работы с файлами.