itmo_conspects

Лекция 3. PowerShell

Изначально 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, который читает 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 можно получить через:

Также PowerShell имеет собственный редактор скриптов PowerShell ISE (от Integrated Scripting Environment - интегрированная среда создания скриптов). Начиная с PowerShell 7, редактор PowerShell ISE устарел, его заменил Visual Studio Code с расширением PowerShell

Основными расширениями PowerShell являются:

PowerShell строится на командлетах (cmdlet) - командах, с помощью которых можно осуществлять взаимодействие с объектами операционной системы

Чаще всего название командлета строится по шаблону Глагол-Существительное, где Глагол может быть Add, Clear, Enable и так далее

Например:

Командлеты:

Имена командлетов не чувствительны к регистру (можно написать и get-process, и Get-Process, и GeT-pRoCeSs), а после командлетов не обязательно ставить ;, за исключением, когда выполняется несколько командлетов в одну строку (например, Get-Process; Get-Service)


Windows имеет механизм безопасности выполнения скриптов, которых выражается в 6 политиках выполнения:

Политики выполнения определены для 5 областей видимости:

Политику можно устанавливать через 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-адрес). После прохождения аутентификации, можно ввести нужный командлет. Однако:

Также можно запустить скрипт на нескольких узлах с помощью командлета 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 можно управлять через следующие командлеты:


Комментарии в 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 есть такие:

Для сравнения используются операторы:

Циклы в PowerShell представлены 5 типами:

Для обработки ошибок используется конструкция TRY ... CATCH:

TRY {
    [int]$Number = Read-Host "Введите число"
    10 / $Number
} CATCH {
    Write-Warning "Некорректное число"
}

Для работы с вводом-выводом существуют командлеты:

Функции в 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 есть командлеты: