Изначально Windows управлялась приложением командной строки cmd.exe, в которой были внутренние команды, а внешние в свою очередь были реализованы в отдельных исполняемых файлах. cmd.exe был создан для Windows NT как аналог оболочки COMMAND.COM, использовавшейся в MS-DOS и ранних версиях Windows, поэтому в cmd.exe перешли из MS-DOS такие команды, как cls, chdir, dir, del, copy и другие
Затем появились скриптовые языки (такие как VBScript - диалект Visual Basic, JScript - диалект JavaScript), с помощью которых можно было управлять объектами операционной системы через компонент Windows Script Host (WSH)
Также существовал Windows Management Instrumentation (WMI) - объектный интерфейс, который позволял получать информацию о системе, менять параметры системы. Через WMI взаимодействовали утилиты wmimgmt.msc, winmgmt.exe, wbemtest.exe, wmic.exe (удален в Windows 11 24H2) и mofcomp.exe или платформу .NET
PowerShell появился как заместитель cmd.exe и WSH:
cmd.exe был бедный и плохо читаемый встроенный язык, а работа с объектами системы через утилиты могла вызвать странное поведениеТак, например, выглядит скрипт для cmd.exe, который читает CSV-файл и находит те вторые поля, в котором встречается bee:
@echo off
setlocal enabledelayedexpansion
rem Путь к CSV-файлу
set "file=data.csv"
for /f "tokens=2 delims=," %%a in (%file%) do (
set "field=%%a"
echo !field! | findstr /i "bee" >nul
if !errorlevel! equ 0 (
echo %%a
)
)
В 2006 появилась оболочка PowerShell, которая была разработана на платформе .NET. Тот же скрипт в PowerShell выглядит так:
# Путь к CSV-файлу
$file = "data.csv"
Import-Csv -Header Column1,Column2,Column3 -Delimiter ',' $file | Where-Object {
$_.Column2 -match "bee"
} | ForEach-Object {
$_.Column2
}
Помимо командной оболочки, которая разработана для администрирования и конфигурирования операционных систем Windows, также PowerShell представляет собой:
Первая версия PowerShell 1.0 вышла в 2006 году для Windows XP Service Pack 2, Server 2003 Service Pack 1, Vista и Server 2008
Вторая версия PowerShell 2.0 вышла в 2009 для Windows 7, PowerShell 3.0 - в 2012 для Windows 8
Четвертая версия PowerShell 4.0 для Windows 8.1 вышла в 2013, в которой добавилась поддержка Where и ForEach для фильтрации и итерации объектов, улучшенного дебаггинга, диагностика сети, а также инструменты платформы управления DSC (Desired State Configuration)
В 2017 году вышла версия PowerShell 5.1, которая выходила в двух редакциях:
Из-за того, что функциональные возможности .NET Framework и .NET Core с точки зрения взаимодействия с система разные, то эти издания имеют разные командлеты
Версия PowerShell 6.0, вышедшая в 2018 на основе .NET Core, стала первой кроссплатформенной.Последняя версия на 2026 год - это PowerShell 7.6, вышедшая в марте 2026 и основанная на .NET 10
PowerShell можно получить через:
wingetТакже PowerShell имеет собственный редактор скриптов PowerShell ISE (от Integrated Scripting Environment - интегрированная среда создания скриптов). Начиная с PowerShell 7, редактор PowerShell ISE устарел, его заменил Visual Studio Code с расширением PowerShell
Основными расширениями PowerShell являются:
.ps1 - файлы скриптов (исторически сложилось название от первой версии оболочки).psd1 - файлы данных скриптов.psm1 - файлы модулей скриптов.ps1xml - файлы конфигурации на языке XMLPowerShell строится на командлетах (cmdlet) - командах, с помощью которых можно осуществлять взаимодействие с объектами операционной системы
Чаще всего название командлета строится по шаблону Глагол-Существительное, где Глагол может быть Add, Clear, Enable и так далее
Например:
Get-Command cmdlet - найти командлеты (например, Get-Command -Verb Get находит все, у которых Глагол - это Get)Get-Help cmdlet - встроенная справка о командлете (флаг -Online для открытия веб-страницы)Get-Member object - возвращает свойства и методы у объектаКомандлеты:
Имена командлетов не чувствительны к регистру (можно написать и
get-process, и Get-Process, и GeT-pRoCeSs), а после командлетов не обязательно ставить ;, за исключением, когда выполняется несколько командлетов в одну строку (например, Get-Process; Get-Service)
Windows имеет механизм безопасности выполнения скриптов, которых выражается в 6 политиках выполнения:
Restricted - блокируется выполнение любых сценариев (по умолчанию на Windows для ПК)AllSigned - разрешено выполнение сценариев, которые имеют цифровую подписьRemoteSigned - разрешено выполнение локальных сценариев, все скачанные сценарии должны иметь цифровую подпись (по умолчанию на Windows Server, начиная с Server 2012 R2)Unrestricted - разрешено выполнение любых сценариев (не рекомендуется, так как небезопасно)Bypass - политика, при которой скрипт запущен внутри другого приложения со своей моделью безопасности, поэтому выполнение скриптов не блокируетсяUndefined - политика не определена (используется политика по умолчанию)Политики выполнения определены для 5 областей видимости:
MachinePolicy - групповая область всех пользователей на этом компьютереUserPolicy - групповая область текущего пользователяProcess - область текущей сессии PowerShellCurrentUser - область текущего пользователяLocalMachine - область всех пользователей на этом компьютереПолитику можно устанавливать через Set-ExecutionPolicy, а узнать через Get-ExecutionPolicy
На компьютерах без Windows доступна только единственная политика - Unrestricted
PowerShell также позволяет удаленно выполнять скрипты через службу WinRM по протоколу HTTP/HTTPS (порт 5985 для HTTP, 5986 для HTTPS). Удаленное выполнение на целевом компьютере включается через Enable-PSRemoting
Чтобы войти в удаленную сессию, используется команда Enter-PSSession:
Enter-PSSession -ComputerName SRV-01
Здесь SRV-01 - имя хоста (также можно указать IP-адрес). После прохождения аутентификации, можно ввести нужный командлет. Однако:
nslookup, netshТакже можно запустить скрипт на нескольких узлах с помощью командлета Invoke-Command:
Invoke-Command -ComputerName SRV-01, SRV-02 -ScriptBlock { ... }
Через аргумент -ScriptBlock можно передать набор команд, а через -FilePath - путь к скрипту на компьютере, где выполняется Invoke-Command. При выполнении скрипта по -FilePath нужно быть внимательным, так как область выполнения - удалённые машины, поэтому переменные среды могут быть разными
Настройки сессии можно сохранять с помощью командлета New-PSSession:
$sessions = New-PSSession -ComputerName s1, s2, c1 -Port 5555 -Credential DOMAIN\Admin
Фоновыми задачами в PowerShell можно управлять через следующие командлеты:
Start-Job - запустить фоновую задачуStop-Job - остановить фоновую задачуGet-Job - посмотреть список фоновых задачReceive-Job - посмотреть результат выполнения фоновой задачиRemove-Job - удалить фоновую задачуWait-Job - заблокировать консоль, пока задача не завершитсяКомментарии в PowerShell бывают:
# строчные
<#
и блочные
#>
Переменные создаются через $имя_переменной = значение. Значение переменной можно получить через $имя_переменной или Get-Variable имя_переменной. Все переменные в текущей сессии хранятся в словаре Variable
В конвейере текущий элемент обозначается через $_
Переменные в PowerShell имеют свой тип - его можно указать (например, [int]$MyIntVar = 5, где типом может быть [int] - целое 32-битное число, [single] - 32-битное число с плавающей точкой, [Boolean] - булевое значение и так далее) или не указывать (тогда переменная может изменить тип при смене значения)
Для присвоения глобальных значений используется синтаксис $Global:переменная = значение
Списки обозначаются как [int[]]$Array = 1, 3, 5, 7, 9, индексируются как $Array[2]
Хеш-таблицы строятся как $ht = @{w1 = "I"; w2 = "LOVE"; w3 = "POWERSHELL"}, доступ через $ht.w1, добавление через $ht.Add("w4", "REALLY") или $ht.w4 = "REALLY"
Условные конструкции в PowerShell есть такие:
IF (...) { ... }IF (...) { ... } ELSE { ... }IF (...) { ... } ELSEIF (...) { ... } ELSE { ... }Конструкция SWITCH:
SWITCH (переменная) {
0 { ... }
1 { ... }
default { ... }
}
Для сравнения используются операторы:
-eq - равно-ne - не равно-gt (от greater than) - больше-lt (от less than) - меньше-ge (от greater or equal) - больше или равно-le (от less or equal) - меньше или равно-like - символ подстановки, например "PowerShell" -like "PowerS*" равно истине-notlike - отрицание символа подстановки-contains - содержит ли значение слева значение справа, например 1, 2, 3, 4, 5 -contains 3 равно истине-notcontains - отрицание -contains-match - совпадение регулярному выражению, например $str = "http://itmo.ru"; $str -match "^http://(\S+)+(\.ru)$" равно истине-notmatch - отрицание -match-and - логическое И-or - логическое ИЛИ-not - логическое НЕЦиклы в PowerShell представлены 5 типами:
WHILEDO WHILEDO UNTILFORFOREACHДля обработки ошибок используется конструкция TRY ... CATCH:
TRY {
[int]$Number = Read-Host "Введите число"
10 / $Number
} CATCH {
Write-Warning "Некорректное число"
}
Для работы с вводом-выводом существуют командлеты:
Write-Host - вывод на экранRead-Host - чтение с консолиOut-File - запись в файл (аналогично можно использовать >)Export-Csv - экспорт данных в CSV-файлConvertTo-Html - конвертация в HTMLConvertTo-Json - конвертация в JSONConvertFrom-Json - конвертация из JSONФункции в PowerShell создаются так:
function Get-DayLog ($param1, $param2) {
Get-EventLog -LogName Application -Newest $param1 ...
}
Вызывается как обычный командлет:
Get-DayLog -param1 50 -param2 -14
Также возможны указание параметров по умолчанию (function Get-DayLog ($param1, $param2=50) { ... }) и возврат значений (return $InternalVariable)
Модули устанавливаются через Install-Module и Install-Script, а импортируется через Import-Module
Для доступа к WMI есть командлеты:
Get-WmiObject (удален в PowerShell 6.0) - через DCOM
DCOM (Distributed COM) - это традиционный и основной протокол для удалённого вызова WMI. Работает поверх RPC, требует настройки DCOM и брандмауэра, обеспечивает высокий уровень безопасности и авторизации. Медленнее в настройке и сложнее для обхода NAT/Firewall.
Get-CimInstance - через WS-Man (или CIM-WS)
WMI-over-WS-Man - современный протокол, основанный на стандарте WSMan (Web Services for Management). Использует HTTP/HTTPS, проще проходит через NAT/Firewall. Более легкий и гибкий в настройке. Поддерживается удаленное управление через PowerShell. Лучше подходит для кроссплатформенного и облачного управления.
CIM-over-HTTPS - протокол, реализующий стандарт CIM (Common Information Model) поверх HTTPS. Современный, защищённый и стандартизованный способ доступа к управлению. Используется в новых версиях Windows и системах Linux с поддержкой Open Management Infrastructure (OMI)