PowerShell: что это такое и основы работы с Windows PowerShell

    Команда Simple-Server
    03.06.2026
    20 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

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

    Данный метод установки поддерживается только на Windows 10 и Windows 11. Процесс установки для двух дистрибутивов идентичен.

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

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

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

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

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

    Основы работы с 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-hash, в которой будет храниться хэш-таблица или словарь данных. Структура данных имеет вид: Ключ: Значение.

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

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

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

    $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.

    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"

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

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

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

    Stop-Process -Name notepad -Force

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

    Start-Service -Name wuauserv Stop-Service -Name wuauserv

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

    Скрипт выше проверяет, запущен ли процесс 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 обладает встроенным функционалом по обеспечению безопасности. Рассмотрим его более подробно.

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

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

    Типы политик встроенных в 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.

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

    1. Создаем самоподписанный сертификат:
    New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyPowerShellCert" -KeyUsage DigitalSignature -KeySpec Signature -NotAfter (Get-Date).AddYears(5) -CertStoreLocation "Cert:\CurrentUser\My"
    1. Выведем данные сертификата. В частности, нам необходим его Thumbprint (отпечаток), который пригодится далее.
    Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
    1. Теперь необходимо добавить сгенерированный сертификат в папку корневых сертификатов. Открываем «Диспетчер сертификатов» через PowerShell:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Set-ExecutionPolicy AllSigned -Scope CurrentUser

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

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


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490₽

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190₽

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны

      PowerShell: что это такое и основы работы с Windows PowerShell

      Команда Simple-Server
      03.06.2026
      20 мин

      Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

      Кратко о задаче

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

      Данный метод установки поддерживается только на Windows 10 и Windows 11. Процесс установки для двух дистрибутивов идентичен.

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

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

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

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

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

      Основы работы с 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-hash, в которой будет храниться хэш-таблица или словарь данных. Структура данных имеет вид: Ключ: Значение.

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

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

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

      $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.

      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"

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

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

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

      Stop-Process -Name notepad -Force

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

      Start-Service -Name wuauserv Stop-Service -Name wuauserv

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

      Скрипт выше проверяет, запущен ли процесс 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 обладает встроенным функционалом по обеспечению безопасности. Рассмотрим его более подробно.

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

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

      Типы политик встроенных в 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.

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

      1. Создаем самоподписанный сертификат:
      New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyPowerShellCert" -KeyUsage DigitalSignature -KeySpec Signature -NotAfter (Get-Date).AddYears(5) -CertStoreLocation "Cert:\CurrentUser\My"
      1. Выведем данные сертификата. В частности, нам необходим его Thumbprint (отпечаток), который пригодится далее.
      Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
      1. Теперь необходимо добавить сгенерированный сертификат в папку корневых сертификатов. Открываем «Диспетчер сертификатов» через PowerShell:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Set-ExecutionPolicy AllSigned -Scope CurrentUser

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

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


      Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

      VPS для проекта

      VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

      StarterVDS

      490₽

      в месяц

      1 ядро

      1 ГБ RAM

      20 ГБ NVMe

      • 1 IPv4
      • KVM
      • Root-доступ
      • Безлимитный трафик
      Заказать VPS
      Рекомендуем

      PerformanceVDS

      1190₽

      в месяц

      2 ядра

      4 ГБ RAM

      60 ГБ NVMe

      • 1 IPv4
      • KVM
      • Root-доступ
      • Базовая DDoS-защита
      Заказать VPS

      Нужна другая конфигурация или чистый VPS без панели?

      Все тарифы VPS

      Похожие статьи, которые могут быть вам интересны

      . \r\n\r\nРассмотрим переменные на практике. Объявим две переменные: одну с именем `myvar1` и содержащую строковой тип данных, и вторую — с именем `myvar2` и содержащую числовой тип данных:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$myvar1 = “This is string variable”\r\n$myvar2 = 32\n```\n\n \r\n\r\nДля вывода значения переменной используется оператор `Write-Output`:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nWrite-Output $myvar1\r\nWrite-Output $myvar2\n```\n\n \r\n\r\nPowerShell автоматически определяет тип данных, но при желании его можно задавать явно:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n[string]$myvar1 = “This is string variable”\r\n[int]$myvar2 = 32\n```\n\n \r\n\r\nПомимо хранения строковых и числовых данных, в переменных можно хранить массивы и хэш-таблицы (они же словари).\r\n\r\nСоздадим переменную `var-array`, в которой будет храниться массив цифр от 1 до 5:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$var_array = @(1, 2, 3, 4, 5)\n```\n\n \r\n\r\nЧтобы вывести значения объектов, хранящихся в массиве, необходимо написать имя переменной и в квадратных скобках указать порядковый номер объекта. Как и в других языках программирования, счет объектов начинается с 0, поэтому для вывода цифры 1 необходимо ввести 0:\r\n\r\nСоздадим другую переменную с именем `var-hash`, в которой будет храниться хэш-таблица или словарь данных. Структура данных имеет вид: `Ключ: Значение`.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$var_hash = @{ \"ID\" = 1; \"Name\" = \"Alex\" }\n```\n\n \r\n\r\nДля вывода значений необходимо указать имя переменной и ключ, например:\r\n\r\nТакже с переменными можно производить различные арифметические операции, например, сложение:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$first_num = 20\r\n$second_num = 30\r\n$sum = $first_num + $second_num\r\nWrite-Output $sum\n```\n\n \r\n \r\n\r\nВ PowerShell присутствуют следующие операторы:\r\n\r\n * Арифметические операторы\r\n * Операторы сравнения\r\n * Логические операторы\r\n * Операторы массивов\r\n\r\n\r\nРассмотрим их на практике.\r\n\r\nИспользуются для математических вычислений. В таблице ниже перечислены все арифметические операторы, доступные в PowerShell:\r\n\r\n**Оператор** | **Описание** \r\n---|--- \r\n+ | Сложение \r\n- | Вычитание \r\n* | Умножение \r\n/ | Деление \r\n% | Остаток от деления \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$a = 15\r\n$b = 10\r\n$c = $a + $b # Сложение\r\n$d = $a - $b # Вычитание\r\n$e = $a * $b # Умножение\r\n$f = $a / $b # Деление\r\n$g = $a % $b # Остаток от деления\r\nWrite-Output $c\r\nWrite-Output $d\r\nWrite-Output $e\r\nWrite-Output $f\r\nWrite-Output $g\n```\n\n \r\n \r\n\r\nИспользуются для проверки условий. В таблице ниже перечислены все операторы сравнения, доступные в PowerShell:\r\n\r\n**Оператор** | **Описание** \r\n---|--- \r\n-eq | Равно \r\n-ne | Не равно \r\n-gt | Больше \r\n-ge | Больше или равно \r\n-lt | Меньше \r\n-le | Меньше или равно \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$c = 25\r\n$d = 45\r\n$c -eq $d # Равно (Equal)\r\n$c -ne $d # Не равно (Not Equal)\r\n$c -gt $d # Больше (Greater Than)\r\n$c -lt $d # Меньше (Less Than)\r\n$c -ge $d # Больше или равно (Greater or Equal)\r\n$c -le $d # Меньше или равно (Less or Equal)\n```\n\n \r\n \r\n\r\nПрименяются в условиях. В таблице ниже перечислены все логические операторы, доступные в PowerShell:\r\n\r\n**Оператор** | **Описание** \r\n---|--- \r\n-and | Логическое И \r\n-or | Логическое ИЛИ \r\n-not или ! | Логическое НЕ \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n($a -gt 5) -and ($b -lt 10) # Логическое \"И\"\r\n($a -gt 5) -or ($b -gt 10) # Логическое \"ИЛИ\"\r\n-not ($a -eq $b) # Логическое \"НЕ\"\n```\n\n \r\n \r\n\r\nУсловные конструкции в PowerShell — это механизмы, позволяющие выполнять код в зависимости от выполнения определенных условий. Они позволяют программе принимать решения, что делает скрипты более гибкими в использовании.\r\n\r\nИспользуются для выполнения кода в зависимости от условия. Рассмотрим использование операторов на примере ниже:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$number = 10\r\nif ($number -gt 5) {\r\nWrite-Output \"Число больше 5\"\r\n} elseif ($number -eq 5) {\r\nWrite-Output \"Число равно 5\"\r\n} else {\r\nWrite-Output \"Число меньше 5\"\r\n}\n```\n\n \r\n \r\n\r\nЦиклы используются для повторного выполнения блока кода, пока выполняется определенное условие. В PowerShell есть несколько видов циклов:\r\n\r\n * `for` — классический цикл с итератором.\r\n * `foreach` — перебирает элементы массива или коллекции.\r\n * `while` — выполняется, пока условие истинно.\r\n * `do-while` — выполняется хотя бы один раз, затем проверяет условие.\r\n * `do-until` — выполняется, пока условие ложно.\r\n\r\n\r\nИспользуется, когда известно количество итераций.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nfor ($i=0; $i -lt 5; $i++) {\r\nWrite-Output \"Итерация $i\"\r\n}\n```\n\n \r\n \r\n\r\nВыполняется, пока условие остается True (пока условие истинно).\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$count = 0\r\nwhile ($count -lt 3) {\r\nWrite-Output \"Счетчик: $count\"\r\n$count++\r\n}\n```\n\n \r\n \r\n\r\nИспользуется для перебора элементов массива.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$numbers = @(1,2,3,4,5)\r\nforeach ($num in $numbers) {\r\nWrite-Output \"Число: $num\"\r\n}\n```\n\n \r\n \r\n\r\nГарантирует хотя бы одну итерацию (сначала выполняет, потом проверяет).\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$i = 0\r\ndo {\r\nWrite-Output \"Число $i\"\r\n$i++\r\n} while ($i -lt 5)\n```\n\n \r\n \r\n\r\nВыполняется до тех пор, пока условие не станет True.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$i = 1\r\ndo {\r\nWrite-Output \"Итерация: $i\"\r\n$i++\r\n} until ($i -gt 3)\n```\n\n \r\n \r\n\r\nФункции в PowerShell позволяют объединять блоки кода и многократно их использовать. Они могут принимать параметры и возвращать значения. \r\n\r\nФункции создаются с помощью ключевого слова `function`:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nfunction SayHello {\r\nWrite-Output \"Привет, PowerShell!\"\r\n}\r\nSayHello\r\nfunction Greet($name) {\r\nWrite-Output \"Привет, $name!\"\r\n}\r\nGreet \"Иван\"\n```\n\n \r\n \r\n\r\n### Функция с несколькими параметрами\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nfunction SumNumbers($a, $b) {\r\nreturn $a + $b\r\n}\r\n$result = SumNumbers 5 10\r\nWrite-Output \"Сумма: $result\"\n```\n\n \r\n \r\n\r\n## Работа с файлами и директориями \r\n\r\nPowerShell отлично подходит для работы с файлами и директориями. Рассмотрим некоторые полезные команды для работы в ОС Windows.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nNew-Item -Path \"C:\\TestFolder\" -ItemType Directory\r\nNew-Item -Path \"C:\\TestFolder\\file.txt\" -ItemType File\r\nSet-Content -Path \"C:\\TestFolder\\file.txt\" -Value \"Hello, world!\"\r\nGet-Content \"C:\\TestFolder\\file.txt\"\r\nCopy-Item -Path \"C:\\TestFolder\\file.txt\" -Destination \"C:\\Users\\file.txt\"\n```\n\n \r\n\r\nДля выполнения команды ниже PowerShell необходимо запустить с правами администратора, иначе при выполнении будет ошибка.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nMove-Item -Path \"C:\\TestFolder\\file.txt\" -Destination \"C:\\Windows\\file.txt\"\r\nRemove-Item -Path \"C:\\TestFolder\\file.txt\"\n```\n\n \r\n\r\n## Работа с процессами и службами \r\n\r\n * **Получение списка процессов**\r\n\r\n\r\nНапример, завершим процесс «Блокнот»:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nStop-Process -Name notepad -Force\n```\n\n \r\n\r\nДля примера запустим службу `wuauserv`:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nStart-Service -Name wuauserv\r\nStop-Service -Name wuauserv\n```\n\n \r\n\r\n## Автоматизация задач с помощью PowerShell \r\n\r\nPowerShell идеально подходит для автоматизации многих задач в Windows. Рассмотрим несколько примеров.\r\n\r\n### Мониторинг процесса и его автоматический перезапуск \r\n\r\nПервая задача, которую разберём, заключается в отслеживании процесса и его автоматическом перезапуске, если он перестанет отвечать:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$processName = \"notepad\"\r\nwhile ($true) {\r\nif (-not (Get-Process -Name $processName -ErrorAction SilentlyContinue)) {\r\nWrite-Output \"$processName не работает! Перезапуск...\"\r\nStart-Process $processName\r\n}\r\nStart-Sleep -Seconds 10\r\n}\n```\n\n \r\n \r\n\r\nСкрипт выше проверяет, запущен ли процесс `notepad` («Блокнот»). Если процесс не найден, то запускает его и проверяет его статус каждые 10 секунд.\r\n\r\nУдаление старых и неактуальных файлов может освободить место на диске. В примере ниже скрипт удаляет файлы, которые старше одного дня, в директории `C:\\TestFolder`:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$folder = \"C:\\TestFolder\"\r\n$days = 1\r\n$limit = (Get-Date).AddDays(-$days)\r\nGet-ChildItem -Path $folder -Recurse | Where-Object { $_.LastWriteTime -lt $limit } | Remove-Item -Force\r\nWrite-Output \"Удалены файлы старше $days дней\"\n```\n\n \r\n \r\n\r\n### Запуск процесса по расписанию \r\n\r\nНастроим автоматический запуск программы «Блокнот» каждый день в 9:00 утра:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$action = New-ScheduledTaskAction -Execute \"notepad.exe\"\r\n$trigger = New-ScheduledTaskTrigger -Daily -At 9am\r\nRegister-ScheduledTask -TaskName \"OpenNotepad\" -Action $action -Trigger $trigger\r\nWrite-Output \"Задача добавлена в планировщик!\"\n```\n\n \r\n \r\n\r\n## Безопасность в PowerShell \r\n\r\nPowerShell обладает встроенным функционалом по обеспечению безопасности. Рассмотрим его более подробно.\r\n\r\n### Политики выполнения (Execution Policies) \r\n\r\nПо умолчанию PowerShell блокирует выполнение скриптов. Чтобы проверить текущую политику, необходимо использовать команду:\r\n\r\nТипы политик встроенных в PowerShell:\r\n\r\n * `Restricted` — Запрещено выполнять скрипты (по умолчанию).\r\n * `AllSigned` — Разрешает только подписанные скрипты.\r\n * `RemoteSigned` — Локальные скрипты выполняются, загруженные из сети должны быть подписаны.\r\n * `Unrestricted` — Можно запускать любые скрипты, но при запуске загруженных файлов появляется предупреждение.\r\n * `Bypass` — Полностью отключает защиту (НЕ рекомендуется).\r\n\r\n\r\nДля изменения политики требуются права администратора. Команда для изменения следующая:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nSet-ExecutionPolicy Unrestricted\n```\n\n \r\n\r\nЧтобы предотвратить запуск вредоносного кода в скриптах, в PowerShell присутствует возможность подписания скриптов. \r\n\r\nЗаранее создаем тестовый скрипт в директории `C:\\TestFolder` со следующим содержимым:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$path = \"C:\\Users\"\r\nif (Test-Path $path) {\r\ntry {\r\nGet-ChildItem -Path $path -Force\r\n} catch {\r\nWrite-Host \"Access denied to $path\"\r\n}\r\n} else {\r\nWrite-Host \"The path does not exist: $path\"\r\n}\n```\n\n \r\n \r\n\r\nСохраняем файл с именем и расширением `script.ps1`.\r\n\r\nДалее подписываем скрипт:\r\n\r\n 1. Создаем самоподписанный сертификат:\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nNew-SelfSignedCertificate -Type CodeSigningCert -Subject \"CN=MyPowerShellCert\" -KeyUsage DigitalSignature -KeySpec Signature -NotAfter (Get-Date).AddYears(5) -CertStoreLocation \"Cert:\\CurrentUser\\My\"\n```\n\n \r\n\r\n 2. Выведем данные сертификата. В частности, нам необходим его Thumbprint (отпечаток), который пригодится далее.\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nGet-ChildItem -Path Cert:\\CurrentUser\\My -CodeSigningCert\n```\n\n \r\n\r\n 3. Теперь необходимо добавить сгенерированный сертификат в папку корневых сертификатов. Открываем «Диспетчер сертификатов» через PowerShell:\r\n\r\n\r\n 4. Переходим в раздел «Personal» (сертификаты пользователя), кликаем по нужному сертификату правой кнопкой мыши и выбираем пункт «Export» (Экспорт):\r\n\r\n\r\n 5. В открывшемся меню нажимаем на кнопку «Next». Выбираем параметр «Не экспортировать закрытый ключ»:\r\n\r\n\r\nДальше нажимаем на кнопку «Browse» и выбираем директорию, куда будет сохранен сертификат.\r\n\r\nНажимаем «Finish», чтобы завершить экспорт.\r\n\r\n 6. Открываем сертификат и нажимаем на кнопку «Install Certificate...»:\r\n\r\n\r\nВыбираем пункт для текущего пользователя:\r\n\r\nДля установки в конкретное хранилище сертификатов выбираем пункт «Place all certificates in the following store»:\r\n\r\nВыбираем «Trusted Root Certification Authorities»:\r\n\r\nЗавершаем установку сертификата нажатием на кнопку «Finish».\r\n\r\n 7. При появлении окна с предупреждением нажимаем «Yes»:\r\n\r\n\r\n 8. Подписываем скрипт `script.ps1`, размещенный в директории `C:\\TestFolder.` Для этого вводим ранее полученный отпечаток после опции `Thumbprint -eq`.\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\n$cert = Get-ChildItem -Path Cert:\\CurrentUser\\My | Where-Object { $_.Thumbprint -eq \"B8D1657CD8D09A2B80BEFEEF378C17DA2FE41352\" }\r\nSet-AuthenticodeSignature -FilePath \"C:\\TestFolder\\script.ps1\" -Certificate $cert\n```\n\n \r\n\r\n 9. Проверяем, что скрипт был успешно подписан:\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nGet-AuthenticodeSignature -FilePath \"C:\\TestFolder\\script.ps1\"\n```\n\n \r\n\r\nПодпись был успешно создана.\r\n\r\nТеперь попробуем запустить неподписанный скрипт при использовании политики `AllSigned`, разрешающей запуск только подписанных скриптов. \r\n\r\nМеняем политику на `AllSigned`:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nSet-ExecutionPolicy AllSigned -Scope CurrentUser\n```\n\n \r\n\r\nСоздаем новый скрипт и попытаемся его запустить:\r\n\r\nСистема вернула ошибку, так как скрипт не подписан.\r\n\r\n---\r\n\r\n**Нужен сервер для практики?** [Арендуйте VPS/VDS в России](/optimalnyij-xosting-dlya-telegram-bota) — root-доступ, NVMe, DDoS-защита и поддержка 24/7."}}