Текстовые строки против объектно-ориентированного подхода
Выходные форматы CMD и PowerShell подчеркивают их различия. Текстовый вывод CMD, хотя и читаемый, не справляется со сложной обработкой данных. PowerShell, однако, выводит богатые, структурированные объекты, облегчающие тонкое манипулирование данными и контроль. Эта объектно-ориентированная модель позволяет выполнять детальный анализ данных и решать сложные административные задачи.
Работа с файлами
PowerShell предоставляет удобные средства для работы с файлами. Вот некоторые ключевые методы:
Для создания файла используйте командлет New-Item с указанием пути к файлу:
New-Item -Path "C:\путь\к\файлу\новыйфайл.txt" -ItemType File
Чтобы записать данные в файл, используйте Out-File или Set-Content:
"Содержимое файла" | Out-File -FilePath "C:\путь\к\файлу\новыйфайл.txt" Set-Content -Path "C:\путь\к\файлу\новыйфайл.txt" -Value "Новое содержимое файла"
Для чтения содержимого файла в массив используйте Get-Content:
$содержимое = Get-Content -Path "C:\путь\к\файлу\новыйфайл.txt"
Для получения информации о файле (размер, дата создания и др.) используйте Get-Item:
$информацияОФайле = Get-Item -Path "C:\путь\к\файлу\новыйфайл.txt"
Для копирования файла в другое место используйте Copy-Item:
Copy-Item -Path "C:\путь\к\файлу\новыйфайл.txt" -Destination "C:\путь\к\копия\новыйфайл.txt"
Для удаления файла воспользуйтесь командлетом Remove-Item:
Remove-Item -Path "C:\путь\к\файлу\новыйфайл.txt" -Force
Помните, что операции удаления файлов необратимы, поэтому будьте осторожны при их использовании.
Установка Invoke-WebRequest
Чтобы использовать Invoke-WebRequest, вам понадобится PowerShell. Итак, давайте узнаем, как установить PowerShell и получить доступ к командлету Invoke-WebRequest!
Windows
Во-первых, вы должны понять, что Windows PowerShell и PowerShell — это две разных программы. Windows PowerShell — это версия PowerShell, поставляемая вместе с Windows, и ее последняя версия — 5.1. Windows PowerShell содержит командлет Invoke-WebRequest. Это означает, что если вы используете современную версию Windows, вы готовы сразу же приступить к делу! При наличии более старых версий следуйте указаниям в официальном руководстве по установке PowerShell.
В то же время некоторые функции Invoke-WebRequest доступны только в версии PowerShell 7.x и более поздних версиях. Дополнительные сведения о том, как установить PowerShell 7.x, приводятся в официальном руководстве по миграции с Windows PowerShell 5.1 на PowerShell 7. Обратите внимание, что PowerShell 7.x устанавливается в новый каталог и работает параллельно с Windows PowerShell 5.1.
Вы можете узнать, какая версия PowerShell установлена на вашем компьютере под управлением ОС Windows, с помощью следующей команды:
$PSVersionTableВ PowerShell 7.x нужно ввести что-то вроде этого:
PSVersion 7.4.1
PSEdition Core
GitCommitId 7.4.1
OS Microsoft Windows 10.0.22631
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0macOS и Linux
Обычные пользователи и ИТ-специалисты
Различие в целевой аудитории между командной строкой (CMD) и PowerShell является важным аспектом, определяющим их дизайн и функциональность. CMD в первую очередь ориентирован на простых пользователей, которым требуется простой и несложный интерфейс для рутинных задач. В эту группу пользователей входят люди с ограниченными техническими знаниями или те, кому необходимо выполнять простые операции, такие как управление файлами, основные системные запросы или запуск предопределенных сценариев. Простота и удобство использования CMD делают его идеальным инструментом для таких пользователей, предоставляя доступную точку входа для утилит командной строки без сложностей сложных сценариев или системного администрирования. Его команды относительно легко выучить и запомнить, что делает CMD практичным выбором для обычных пользователей или тех, кто время от времени взаимодействует с командной строкой Windows для быстрых исправлений или незначительных корректировок.
Напротив, PowerShell разработан с учетом потребностей ИТ-специалистов и опытных пользователей. Это пользователи, которым требуется более надежный и универсальный набор инструментов для комплексного управления системой, автоматизации и расширенных сценариев. PowerShell предназначен для системных администраторов, разработчиков и технических специалистов, которым необходимо управлять сложными рабочими процессами, автоматизировать задачи в нескольких системах и сложными способами манипулировать данными. Богатый набор функций PowerShell, включая объектно-ориентированные сценарии, доступ к платформе .NET и расширенные возможности манипулирования данными, делает его очень подходящим для решения этих сложных задач. Более того, способность PowerShell интегрироваться с различными сетевыми компонентами и управлять рядом системных ресурсов делает его предпочтительным инструментом в корпоративных средах и среди профессионалов, управляющих крупномасштабными ИТ-инфраструктурами. Его масштабируемость и гибкость позволяют этим пользователям создавать сложные сценарии автоматизации, управлять конфигурациями системы и выполнять сложные административные задачи с большей эффективностью и контролем.
CMD остается стабильным компонентом Windows, но имеет ограниченные перспективы развития, в основном обслуживая устаревшие функции поддержки. PowerShell, наоборот, развивается: Microsoft регулярно обновляет свои функции и способствует растущему сообществу. Его принятие и интеграция с различными платформами указывают на потенциал его будущего роста.
Чем PowerShell отличается от cmd
Рассмотрим сравнение двух основных инструментов командной строки в операционной системе Windows: PowerShell и командной строки (cmd). Оба инструмента позволяют взаимодействовать с операционной системой через команды и сценарии, однако они существенно различаются по своим характеристикам и функциональности.
| Аспект | PowerShell | Командная строка (cmd) |
|---|---|---|
| Язык сценариев | Мощный язык на основе .NET Framework | Ограниченный язык для выполнения команд |
| Объектная модель | Работа с объектами и конвейерная обработка | Работа с текстовыми строками и потоками |
| Управление системой | Обширный набор командлетов для управления | Ограниченный набор команд для управления |
| Синтаксис | Современный и читаемый синтаксис | Простой синтаксис команд и аргументов |
| Поддержка модулей | Поддержка модулей для организации функциональности | Отсутствие концепции модулей |
Для чего нужен PowerShell
PowerShell — это мощный инструмент для автоматизации задач, управления операционной системой и взаимодействия с различными приложениями и сервисами. Он широко используется администраторами систем, разработчиками, а также специалистами в области IT для решения разнообразных задач. Вот некоторые из основных применений PowerShell:
- Автоматизация задач: PowerShell позволяет создавать сценарии (скрипты) для автоматизации повторяющихся и рутинных задач, таких как установка программ, настройка системных параметров, копирование файлов и многие другие операции.
- Управление системой: PowerShell предоставляет доступ к широкому спектру системных функций, позволяя администраторам управлять пользователями, группами, службами, процессами, реестром и другими системными ресурсами.
- Конфигурация и развертывание: С помощью PowerShell можно создавать и применять конфигурации для развертывания и управления серверами и компьютерами, что делает процесс управления парком устройств более эффективным.
- Мониторинг и анализ: PowerShell позволяет анализировать системные данные, собирать статистику, мониторить производительность и события, что помогает администраторам быстро реагировать на проблемы.
- Взаимодействие с внешними приложениями и службами: PowerShell может взаимодействовать с другими приложениями и службами, используя API, веб-службы, REST API и другие протоколы, что позволяет автоматизировать процессы, связанные с сторонними приложениями.
- Разработка и тестирование: Разработчики используют PowerShell для создания сценариев тестирования, сборки проектов, управления версиями и других задач, связанных с разработкой ПО.
- Обработка данных: PowerShell предоставляет мощные инструменты для обработки и анализа данных, таких как текстовые файлы, CSV, XML и другие форматы данных.
- Безопасность: PowerShell может использоваться для управления политиками безопасности, мониторинга событий безопасности, а также для проведения аудитов безопасности системы.
Выбор подходящего инструмента для решения задачи
Решение использовать командную строку (CMD) или PowerShell во многом зависит от характера и сложности поставленной задачи. CMD — идеальный выбор для простых и понятных задач, требующих базового интерфейса командной строки. Простота использования и знакомство делают его хорошо подходящим для рутинных операций, таких как навигация по файлам, основные системные запросы или выполнение простых сценариев. Пользователи, которые не глубоко разбираются в технических сценариях или системном администрировании, найдут CMD удобным и достаточным для своих нужд. Его простой синтаксис и немедленное выполнение команд обеспечивают быстрое и простое решение основных задач, что делает его идеальным инструментом для пользователей, которые ищут простоту и немедленные результаты без необходимости в продвинутых навыках программирования или сложных структурах команд.
С другой стороны, PowerShell — лучший инструмент для решения более сложных и сложных задач. Его особенно предпочитают ИТ-специалисты, системные администраторы и опытные пользователи, которым требуется мощная и универсальная среда сценариев. PowerShell превосходно справляется со сложными сценариями, автоматизацией задач и расширенным управлением системой, предлагая широкий спектр возможностей, намного превосходящий возможности CMD. Его интеграция с платформой .NET обеспечивает надежную работу со сценариями, позволяя пользователям писать и выполнять сценарии, которые выполняют сложные операции, сложным образом манипулируют данными и автоматизируют повторяющиеся задачи в разных системах. Более того, объектно-ориентированный подход PowerShell и его способность работать с различными системными объектами делают его незаменимым инструментом для детального администрирования и управления системой. Он предлагает уровень контроля и гибкости, необходимый для управления современными ИТ-средами, что делает его важным инструментом для пользователей, которым необходимо выйти за рамки простого выполнения команд для достижения детального, автоматизированного и эффективного управления системой.
Хотя CMD и PowerShell обеспечивают взаимодействие с командной строкой в Windows, они удовлетворяют разные потребности. CMD подходит для базовых задач и пользователей, ищущих простоту. PowerShell с его расширенными функциями и объектно-ориентированным подходом ориентирован на управление и автоматизацию сложных систем, что делает его мощным инструментом для ИТ-специалистов и опытных пользователей. Выбор между CMD и PowerShell зависит от сложности и требований поставленной задачи.
Условия
Условные операторы в PowerShell создаются с использованием ключевых слов if, elseif и else. В круглых скобках указывается само условие, а в фигурных скобках содержится код, который выполняется при выполнении условия. Например:
$Number = 123
if ($Number -gt 0) {
Write-Host 'Число больше нуля'
} elseif ($Number -lt 0) {
Write-Host 'Число меньше нуля'
} else {
Write-Host 'Число равно нулю'
}
Результат выполнения кода: Число больше нуляКроме того, условия также можно задавать с помощью ключевого слова switch. Например:
$Day = 5
switch ($Day) {
1 { Write-Host 'Понедельник' }
2 { Write-Host 'Вторник' }
3 { Write-Host 'Среда' }
4 { Write-Host 'Четверг' }
5 { Write-Host 'Пятница' }
6 { Write-Host 'Суббота' }
7 { Write-Host 'Воскресенье' }
}
Результат выполнения кода: ПятницаЦиклы
В PowerShell существует несколько видов циклов:
- Цикл с предусловием
while:
$counter = 0
while ($counter -lt 5) { Write-Host "Counter is $($counter)" $counter++
}- Цикл с постусловием истинным
do while:
$counter = 0
do { Write-Host "Counter is $($counter)" $counter++
} while ($counter -lt 5)- Цикл с постусловием ложным
do until:
$counter = 0
do { Write-Host "Counter is $($counter)" $counter++
} until ($counter -ge 5)- Цикл с известным числом итераций
for:
for ($i = 0; $i -lt 5; $i++) { Write-Host "Iteration is $i"
}- Цикл с перебором элементов коллекции
foreach:
$numbers = 1..5
foreach ($num in $numbers) { Write-Host "Number is $num"
}Во всех случаях синтаксис похож на синтаксис условных операторов: в круглых скобках указывается условие или параметры, а в фигурных скобках — код, который выполняется внутри цикла.
Как открыть PowerShell в Windows
Как правило, PowerShell уже установлен на вашем компьютере по умолчанию. Однако, если по какой-то причине его нет, вы можете воспользоваться инструкциями, предоставленными Microsoft. В дополнение, в официальной документации имеются подробные руководства по установке на macOS и Linux.
PowerShell является независимым от версии операционной системы инструментом и работает одинаково стабильно как на Windows 10, так и на Windows Server.
Существует два основных метода для запуска PowerShell или PowerShell ISE в системе Windows: через меню «Пуск» и с помощью приложения «Выполнить».
- Для того чтобы открыть PowerShell через меню «Пуск», пройдите к папке Windows PowerShell, откройте её и выберите необходимое приложение. В этой директории доступны как 32-разрядные версии (отмечены как x86 в скобках), так и 64-разрядные версии терминала и ISE.

- Чтобы запустить PowerShell через приложение «Выполнить», используйте комбинацию клавиш Win + R. Когда появится окно, введите
powershellилиpowershell ise(в зависимости от того, какое приложение вам нужно) и нажмите кнопку ОК.

Упрощенный и сложный синтаксис
Синтаксис CMD удобен для пользователя и идеально подходит для новичков или тех, кто ищет простоту. Синтаксис PowerShell, хотя и последователен, но более сложен из-за расширенных функций и интеграции с платформой .NET. Он предлагает мощные возможности создания сценариев, но требует больше усилий для освоения.

Как указать прокси-сервер HTTP в Invoke-WebRequest
Прежде чем начать, запустите следующую команду в PowerShell:
Invoke-WebRequest "https://httpbin.org/ip"
That should print something like:
StatusCode : 200
StatusDescription : OK
Content : {
"origin": "194.34.233.12"
}
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 32
Content-Type: application/json
Date: Thu, 01 Feb 2024 10:46:14 GMT...
Forms : {}
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,
true], [Content-Length, 32]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 32Если вы хотите получить доступ только к полю «Контент», вы можете сделать это следующим образом:
$response = Invoke-WebRequest "https://httpbin.org/ip"
$response.Content
This would print:
{
"origin": "194.34.233.12"
}Использование параметра командной строки
Invoke-WebRequest предлагает флаг -Proxy для указания URL-адреса прокси-сервера для запроса.
Итак, синтаксис использования Invoke-WebRequest на прокси-сервере выглядит следующим образом:
Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>Если теперь вы выполните эту команду PowerShell:
Invoke-WebRequest -Proxy "http://190.6.23.219:999" "https://httpbin.org/ip"
Invoke-WebRequest -Uri "http://httpbin.org/ip" -Proxy "http://brd.superproxy.io:22225" -ProxyCredential (New-Object System.Management.Automation.PSCredential("brd-customer-CUSTOMER_ID-zone-ZONE’S_NAME", ("ZONE’S_PASSWORD" | ConvertTo-SecureString -AsPlainText -Force)))
The result should be:
StatusCode : 200
StatusDescription : OK
Content : {
"origin": "190.6.23.219"
}
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 31
Content-Type: application/json
Date: Thu, 01 Feb 2024 12:36:56 GMT...
Forms : {}
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,
true], [Content-Length, 31]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 31Примечание: не забывайте, что бесплатные прокси-серверы недолговечны! К тому времени, когда вы прочитаете это руководство, маловероятно, что вышеуказанный сервер все еще будет работать. В случае ошибки замените его новым прокси-сервером.
Использование переменных окружения
Начиная с версии PowerShell 7.0, Invoke-WebRequest поддерживает конфигурацию прокси-сервера с помощью переменных окружения.
Таким образом, другой способ использования прокси-сервера PowerShell в Invoke-WebRequest заключается в установке следующих двух окружений:
- HTTP_PROXY — это URL-адрес прокси-сервера, используемый для HTTP-запросов;
- HTTPS_PROXY — это URL-адрес прокси-сервера, используемый для HTTPS-запросов.
В Windows можно задать две переменные окружения, используя следующий синтаксис PowerShell:
$env:HTTP_PROXY = "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"
$env:HTTPS_PROXY = "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"В нашем примере команды будут выглядеть следующим образом:
$env:HTTP_PROXY = "http://190.6.23.219:999"
$env:HTTPS_PROXY = "http://190.6.23.219:999"В macOS и Linux вам необходимо использовать следующий синтаксис:
export HTTP_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"
export HTTPS_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"Итак, две команды будут следующими:
export http_proxy="http://190.6.23.219:999"
export https_proxy="http://190.6.23.219:999"Отныне каждый запрос Invoke-WebRequest будет проходить через указанные прокси-серверы без необходимости добавлять опцию -Proxy. После настройки envs запустите следующую команду:
Invoke-WebRequest "https://httpbin.org/ip"
You will get the same result as before:
StatusCode : 200
StatusDescription : OK
Content : {
"origin": "190.6.23.219"
}
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 31
Content-Type: application/json
Date: Thu, 01 Feb 2024 12:36:56 GMT...
Forms : {}
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,
true], [Content-Length, 31]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 31Чтобы отключить прокси-серверы Invoke-WebRequest, отключите переменные окружения с помощью:
$env:HTTP_PROXY = ""
$env:HTTPS_PROXY = ""
Or on macOS and Linux:
unset HTTP_PROXY
unset HTTPS_PROXYМассивы, хеш-таблицы, функции и классы
В PowerShell есть множество возможностей для создания сложных структур данных и алгоритмов. Вот краткое описание некоторых из них:
- Массивы (Arrays): позволяют хранить набор элементов одного типа. Элементы могут быть доступны по индексам. Создаются массивы с использованием квадратных скобок
[ ].
$fruits = "Apple", "Banana", "Orange" $fruits[0] # Доступ к элементу массива по индексу
- Хеш-таблицы (Hash Tables): представляют собой пары ключ-значение, где ключи уникальны. Они полезны для хранения и быстрого доступа к данным по ключу.
$person = @{
Name = "John"
Age = 30
City = "New York"
}
$person["Name"] # Доступ к значению по ключу- Пользовательские функции: Вы можете определить собственные функции для группировки кода и повторного использования. Их определение происходит с использованием ключевого слова
function.
function Get-Sum {
param($a, $b)
return $a + $b
}
$result = Get-Sum 5 3- Пользовательские классы: PowerShell также поддерживает создание пользовательских классов, что позволяет создавать более сложные объекты с различными свойствами и методами.
class Person {
[string] $Name
[int] $Age
Person([string] $name, [int] $age) {
$this.Name = $name
$this.Age = $age
}
[string] GetInfo() {
return "$($this.Name), $($this.Age) years old"
}
}
$person = [Person]::new("Alice", 25)
$info = $person.GetInfo()Работа в PowerShell ISE
Командная оболочка PowerShell представляет собой удобный инструмент для выполнения малых, кратких однострочных задач. Однако для создания и сохранения более сложных сценариев существует интегрированная среда разработки скриптов PowerShell ISE.
PowerShell ISE представляет собой инструмент, состоящий из трех основных панелей:
- Область скриптов в верхней части экрана, предназначенная для написания сценариев.
- Консольная область в нижней части экрана, которая функционирует как обычный терминал, позволяя вводить команды в интерактивном режиме.
- Панель команд в правой части экрана, предоставляющая полное руководство по командам PowerShell. В ней также есть конструктор, который помогает задать значения нужных параметров.
Комментарии в коде
Вот пример PowerShell скрипта с комментариями:
# Это комментарий в одну строку, начинается с символа '#' и продолжается до конца строки.
# Пример переменной
$имя = "John"
$возраст = 30
# Вывод информации
Write-Host "Привет, $имя! Тебе $возраст лет."
# Это многострочный комментарий, который начинается с '<#' и заканчивается '#>'.
<#
Этот блок комментария может быть многострочным и располагаться
на нескольких строках, чтобы объяснить более сложные участки кода.
#>
# Функция для сложения двух чисел
function Сложить-Числа { param( [int]$число1, [int]$число2 ) $результат = $число1 + $число2 return $результат
}
# Вызов функции и вывод результата
$результатСложения = Сложить-Числа -число1 5 -число2 7
Write-Host "Результат сложения: $результатСложения"Хорошая практика — комментировать код таким образом, чтобы другие разработчики (или вы в будущем) могли легко понять, как работает код и какие цели преследовались при его написании.
Советы по написанию хорошего кода:
- Применяйте нотацию PascalCase для названий командлетов, функций, параметров, свойств, методов, переменных и классов. Разработчики Powershell выпустили для этого гайд. Не рекомендуется:
get-service,Get-service,GET-SERVICE. Рекомендуется:Get-Service. - Используйте полные названия командлетов. Алиасы удобны для интерактивного режима, но в скриптах они могут затруднить понимание. Не рекомендуется:
dir,gci,ls. Рекомендуется:Get-ChildItem. - Применяйте стиль One True Brace для форматирования вложенных блоков кода. Если вы используете фигурные скобки, внутренний код отделяется табуляцией (четыре пробела), а фигурные скобки размещаются следующим образом:
if ($var1 -eq $var2) {
# Код внутри условия
} else {
# Код внутри else
# Еще код внутри else
}Исключение: когда код внутри фигурных скобок небольшой, его можно записать в одну строку:
Get-ChildItem | Where-Object { $_.Length -gt 10mb }Запуск скриптов
В PowerShell ISE имеется возможность выполнять код как целиком, так и частично, а также предоставляются инструменты для отладки. Скрипты сохраняются в файлах с расширением .ps1. Однако запустить скрипт, просто дважды щелкнув по нему, не получится. Вместо этого вы можете нажать правую кнопку мыши и выбрать опцию Выполнить с помощью PowerShell.
Также существует возможность запуска скрипта из оболочки. Например, предположим, у вас есть файл скрипта test_script.ps1 в каталоге C:\Scripts. Вы можете выполнить его двумя способами:
- Используя команду
PowerShell -File C:\Scripts\test_script.ps1из любого места. Это позволяет запустить скрипт, указав полный путь к файлу. - Используя команду
.\test_script.ps1, если вы находитесь в каталогеC:\Scripts. Это запустит скрипт, находясь в том же каталоге, что и файл скрипта.
Такие методы позволяют управлять выполнением PowerShell скриптов из разных мест и с разных уровней оболочки.
Политика выполнения. Как разрешить выполнения скриптов
По умолчанию запрещено выполнение файлов с PowerShell-скриптами, и это сделано с целью обеспечения безопасности. Вы можете узнать текущую политику выполнения с помощью командлета Get-ExecutionPolicy. Вот какие варианты политики выполнения могут быть доступны:
- Restricted (Установлена по умолчанию) — запрещено выполнение любых скриптов. Это означает, что нельзя будет запустить ни один скрипт.
- AllSigned — разрешено выполнение только тех скриптов, которые были подписаны доверенным разработчиком. Это обеспечивает повышенный уровень безопасности, так как только подписанные и проверенные скрипты могут быть выполнены.
- RemoteSigned — разрешено выполнение подписанных доверенным разработчиком скриптов, а также собственных скриптов. Это предоставляет баланс между безопасностью и удобством, позволяя запускать свои скрипты.
- Unrestricted — разрешено выполнение любых скриптов без каких-либо ограничений. Это предоставляет наивысший уровень гибкости, но может повысить риск безопасности.
Чтобы ваши файлы с расширением .ps1 запускались, вам следует изменить политику выполнения на RemoteSigned. Для этого выполните следующие шаги:
- Откройте PowerShell от имени администратора. Для этого щелкните правой кнопкой мыши по значку PowerShell на панели задач или в меню «Пуск» и выберите «Запуск от имени администратора».
- В открывшемся окне PowerShell введите следующую команду и нажмите Enter:
Set-ExecutionPolicy RemoteSigned
- Подтвердите изменение политики выполнения, нажав клавишу
Y(Yes).
Теперь вы сможете запускать свои файлы .ps1 без ограничений. Однако, имейте в виду, что изменение политики выполнения может повлиять на безопасность системы, поэтому будьте осторожны и убедитесь, что вы запускаете только те скрипты, которые вы знаете и доверяете.
Какой прокси-сервер PowerShell следует использовать?
Ответ на этот вопрос меняется в зависимости от того, чего вы хотите достичь с помощью запроса Invoke-WebRequest. Чтобы найти подходящий прокси-сервер PowerShell для ваших нужд, ознакомьтесь с различными типами доступных прокси-серверов:
- Прокси-серверы центров обработки данных: они быстрые и дешевые, но сайты могут легко обнаружить и заблокировать их из-за их идентифицируемых диапазонов IP-адресов.
- Резидентные прокси-серверы: они предлагают ротацию подлинных IP-адресов с реальных устройств в определенных местах. Это означает, что они могут гарантировать высокий уровень анонимности. Резидентные прокси-серверы идеально подходят для доступа к сайтам, использующим географические ограничения, или для обхода мер по борьбе с ботами.
- Прокси-серверы интернет-провайдеров (ISP): они безопасны, быстры и очень надежны, поскольку предоставляют статические IP-адреса устройств, зарегистрированных у интернет-провайдеров. Прокси-серверы ISP также называют резидентными статическими прокси-серверами, и они являются идеальным решением для мониторинга оптимизации поисковых систем (SEO) и исследования рынка.
- Мобильные прокси-серверы: они предоставляют IP-адреса с реальных мобильных устройств для обеспечения высокого уровня анонимности. Они полезны для доступа к приложениям, сайтам или контенту, специально разработанному для мобильных устройств.
Переменные
Для сохранения данных и обращения к ним в будущем в PowerShell используются переменные. Перед названием переменной ставится символ доллара $, и переменные могут содержать латинские буквы (как заглавные, так и строчные), цифры и символ нижнего подчеркивания.
Переменные в могут хранить данные различных типов, и значения в них можно изменять (перезаписывать).

Создадим переменную со строкой 2023 и преобразуем её в число. Для того чтобы узнать тип данных, воспользуемся методом .GetType():
$stringValue = "2023" $intValue = [int]$stringValue $intValue.GetType()

Для удаления переменной используется метод .Clear().
Переменные можно вставлять в строки, если строки оформлены двойными кавычками. В случае одинарных кавычек, PowerShell воспринимает символы в строке буквально. Давайте сравним два примера:
$number = 42 Write-Host "The number is $number" # Вывод: The number is 42 Write-Host 'The number is $number' # Вывод: The number is $number
В первом случае, используя двойные кавычки, значение переменной $number подставляется в строку. Во втором случае, с использованием одинарных кавычек, строка остается буквальной, и $number не интерпретируется как переменная.
Кроме пользовательских переменных, существуют и системные переменные. Например, $PSVersionTable содержит информацию о версии PowerShell.

Фоновое выполнение команд
Определенные задачи могут требовать значительного времени на выполнение. Примеры таких задач включают установку и обновление программного обеспечения или поиск файлов в обширной директории. Важно помнить, что во время выполнения одной команды в PowerShell нельзя вводить другие команды.
Рассмотрим пример: предположим, нужно найти файл powershell.exe на всем диске C. Для этой цели воспользуемся командлетом Get-ChildItem с параметром -Recurse. Это позволит ему искать файл не только в текущем каталоге, но и во всех его подкаталогах.
Следует учитывать, что PowerShell может столкнуться с папками, к которым у него нет доступа. Чтобы обойти возможные ошибки, добавим параметр -ErrorAction SilentlyContinue. Это означает, что в случае ошибки команда не будет генерировать уведомления, а просто продолжит выполнение.
Таким образом, данная ситуация выглядит следующим образом:
Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue

Очевидно, что во время выполнения задачи, командная строка становится недоступной. Для принудительного прерывания выполнения задачи можно воспользоваться сочетанием клавиш Ctrl + C. Важно убедиться, что при этом ничего не выделено, чтобы избежать возможного восприятия компьютером как команды «Копировать».
Start-Job {Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue}
Параллельно возможно выполнение любого числа фоновых задач. В дополнение к командлету Start-Job, предназначенному для управления фоновыми задачами, существуют и другие командлеты:
Get-Jobпредоставляет отчет о состоянии фоновых задач.Wait-Jobблокирует консоль до завершения фоновой задачи.Stop-Jobпрекращает выполнение фоновой задачи.Receive-Jobвыводит результаты выполнения фоновой задачи и очищает их из памяти. Для сохранения результатов в памяти используйте параметр-Keep.
Опции Wait-Job, Stop-Job и Receive-Job требуют указания имени Name или идентификатора Id конкретной задачи или задач (в случае нескольких). Это можно сделать непосредственно или в связке с командлетом Get-Job.
Get-Job Job1

Как использовать прокси HTTPS и SOCKS в PowerShell
Если вам требуется использовать прокси-сервер HTTPS или SOCKS, необходимо обновить PowerShell до версии 7.x и выше. В противном случае Invoke-WebRequest завершится ошибкой:
Invoke-WebRequest: ServicePointManager не поддерживает прокси-серверы со схемой https.
Или в случае прокси-сервера SOCKS:
Invoke-WebRequest: ServicePointManager не поддерживает прокси-серверы со схемой socks.
При работе с прокси-серверами HTTPS или SOCKS в PowerShell 7.x структура команд Invoke-WebRequest остается прежней:
Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>Отличия заключаются в том, что
Если вы попытаетесь вызвать запрос через прокси-сервер, использующий протокол, отличный от указанного выше, вы получите следующую ошибку:
Invoke-WebRequest: Only the 'http', 'https', 'socks4', 'socks4a' and 'socks5' schemes are allowed for proxies.Таким образом, полный пример прокси-запроса Invoke-WebRequest SOCKS выглядит так:
Invoke-WebRequest -Proxy "socks5://94.14.109.54:3567" "http://httpbin.org/ip"
As you can expect, the result will be:
StatusCode : 200
StatusDescription : OK
Content : {
"origin": "94.14.109.54"
}
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Length: 31
Content-Type: application/json
Date: Thu, 01 Feb 2024 12:47:56 GMT...
Forms : {}
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,
true], [Content-Length, 31]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 31Команды (командлеты) PowerShell
В языке программы PowerShell команды носят название командлеты (от английского «cmdlet»). Все они формируются с использованием шаблона «Глагол-Существительное», или «Действие-Объект». Например, Get-Services и Start-Process. Благодаря такой структуре, можно легко понять предназначение команды, даже если вы с ней ещё не работали ранее.
Синтаксис командлетов
После имени самого командлета следует указание параметров и их значений. Между всеми частями команды следует проставлять пробелы. Вот пример синтаксиса командлета, который позволяет перейти в директорию C:\:
Set-Location -LiteralPath C:\ -PassThru
Разберем его на составные части:
Set-Location— буквально «вызвать команду». Этот командлет позволяет выполнять указанный блок сценария.-LiteralPath C:\— здесь передаем блок сценария, в котором используется командаSet-Locationдля перехода в каталогC:\.-PassThru— по умолчанию командлетInvoke-Commandне возвращает результат выполнения. Этот параметр указывает на необходимость вывода информации о местоположении, в которое был выполнен переход с помощью командыSet-Location.

Важно отметить, что регистр букв в командах PowerShell не имеет значения. Таким образом, данную команду можно записать в виде заглавных букв, строчных букв или даже смешанного регистра, и она все равно будет выполняться:
sEt-loCATion -PATH c:\ -passthru
Когда в одной строке объединены несколько команд, они разделяются точкой с запятой .;
Иногда команда может быть слишком длинной. Для разделения на несколько строк можно использовать символ обратного апострофа ` в месте переноса. Новую строку можно создать, нажав Shift + Enter (для переноса строки ниже текущей) или Ctrl + Enter (для переноса строки выше текущей).
Разделим предыдущую команду:
Set-Location ` -LiteralPath C:\ ` -PassThru

Алиасы
В процессе работы с терминалом иногда может быть неудобно постоянно вводить полные названия командлетов. Именно поэтому у наиболее часто используемых командлетов существуют псевдонимы (алиасы) — их сокращенные варианты.
Чтобы получить список доступных алиасов, вы можете воспользоваться командой Get-Alias. Кроме того, данной команде также доступен псевдоним gal.

Чтобы получить список алиасов для конкретного командлета, вы можете использовать параметр -Definition. Пример:
Get-Alias -Definition Set-Location

Если вам нужно узнать полное название командлета по его алиасу, используйте параметр -Name. Этот параметр необязателен, так как он является аргументом по умолчанию.
# Оба следующих варианта эквивалентны: Get-Alias -Name clear Get-Alias clear

Особенности обработки путей к каталогам
Для многих командлетов необходимо предоставить путь к файлу или каталогу. Это делается с использованием строки, например: C:\Windows\System32.
Однако, если в пути встречается пробел или другой специальный символ, PowerShell будет рассматривать его как разделитель. Например:
# Следующая команда не будет выполнена корректно Set-Location C:\Program Files

PowerShell «воспринимает» пробел и интерпретирует его так, будто путь к папке закончился на слове Program, а files — это уже значение другого параметра.
Чтобы избежать подобных ситуаций, существует два метода:
- Экранировать символы с помощью обратного апострофа
`:C:\Program` Files. Однако это может быть неудобным, если путь длинный. - Поместить весь путь в одинарные или двойные кавычки:
'C:\Program Files'или"C:\Program Files"(желательнее использовать одинарные кавычки).
Кроме того, в PowerShell существуют сокращения для быстрого доступа к ближайшим директориям:
- Точка
.указывает на текущий каталог. Например,Get-ChildItem .позволяет просмотреть содержимое текущего местоположения. - Две точки
..указывают на родительский каталог. Например,Set-Location ..позволяет перейти к родительскому каталогу. Это может быть полезно, если вы находитесь в глубоко вложенной директории.
Большинство командлетов имеют параметры -Path и -LiteralPath, позволяющие указать путь к файлу или папке. Разница между ними заключается в том, что в -Path можно включать переменные, в то время как —LiteralPath интерпретирует символы буквально, даже если они содержат имя переменной.
Get-Help: как изучать новые командлеты
Для получения подробной информации о конкретном командлете воспользуйтесь командой Get-Help Название-Командлета. Пример:
Get-Help Get-Childitem

У команды Get-Help имеется несколько полезных параметров:
-Detailedпредоставляет более подробную справку по командлету.-Fullпредоставляет полную справку.-Examplesдемонстрирует примеры использования командлета.-Onlineперенаправляет пользователя на веб-страницу с соответствующей документацией.
Базовая пакетная обработка и расширенная автоматизация
Сценарии CMD основаны на простых пакетных файлах, подходящих для базовой автоматизации, например резервного копирования файлов или установки программного обеспечения. Отсутствие расширенных функций ограничивает его применение в сложных административных сценариях. PowerShell, с другой стороны, предлагает комплексную среду сценариев. Его сценарии поддерживают расширенные функции, такие как обработка ошибок, пользовательские функции и классы .NET, что обеспечивает комплексную автоматизацию задач и взаимодействие с системой.
Манипулирование объектами и управление системой
CMD предлагает ограниченные возможности для прямого взаимодействия с системой, в первую очередь для обработки основных файловых операций и настроек системных переменных. Он не справляется с манипулированием системными объектами или доступом к расширенным системным функциям. PowerShell, использующий .NET Framework, превосходно справляется с прямым манипулированием системой. Его способность обрабатывать разнообразные системные объекты и ресурсы делает его незаменимым для современного системного администрирования.
Расширение возможностей: контрастность настройки
Настройка CMD ограничивается пакетными файлами и встроенными командами, что дает ограниченные возможности. PowerShell с поддержкой модулей и командлетов обеспечивает широкие возможности настройки. Этот модульный подход позволяет пользователям значительно расширять функциональность PowerShell, адаптируясь к различным задачам и средам.
Объекты и конвейеры (пайплайны) в PowerShell
Когда вы работаете с командлетами в PowerShell, они возвращают не просто строки, а объекты — структуры данных, содержащие набор свойств и методов.
То, что отображается в терминале после выполнения команды в виде строки, на самом деле является визуальным представлением объекта. Программа PowerShell отображает определенные свойства объектов в виде таблицы, но далеко не все свойства могут быть отображены таким образом.
Аналогично тому, как командлеты могут возвращать объекты, они также могут принимать и обрабатывать их. Вы можете создать команду, которая возвращает объект, передать этот объект другому командлету, получить объект из него и так далее — этот процесс и называется конвейерами или пайплайнами.
Пример работы конвейера в PowerShell
Команда Get-Process возвращает список запущенных процессов на компьютере. При передаче ей имени процесса (или шаблона, созданного с помощью регулярных выражений), команда выведет только соответствующие элементы списка.
Рассмотрим пример, где вызываем запущенный процесс PowerShell:
Get-Process powershell

Мы получаем объект и таблицу, отображающую некоторые его свойства. Чтобы узнать все свойства и методы, давайте передадим этот объект командлету Get-Member. Для этого используется конвейер:
Get-Process powershell | Get-Member

Команда Get-Member получает объект от команды Get-Process и выводит таблицу со всеми его свойствами и методами. Результат работы Get-Member также представляет собой объект (точнее, список объектов), который можно передать по конвейеру дальше.
Допустим, нужно вывести только те строки, в которых MemberType равно Property. Для этого используем команду Where-Object:
Get-Process powershell | Get-Member | Where-Object {$_.MemberType -eq 'Property'}
Команда Where-Object последовательно обходит каждый объект, полученный от команды Get-Member. Выражение в фигурных скобках — логическое:
$_ссылается на текущий объект (то есть на отдельную строку в таблице);.MemberTypeобращается к значению свойстваMemberTypeв этом объекте;-eqвыполняет сравнение между выражением слева и выражением справа от него;'Property'представляет значение, которое ожидаем увидеть у свойстваMemberType.
Более подробно о логических выражениях рассказано ниже.
Форматирование таблиц с помощью конвейеров
Командлет Format-Table в PowerShell предоставляет возможность настроить вывод таблицы в терминале: выбирать нужные свойства и методы, устанавливать ширину столбцов, группировать данные по нескольким таблицам и т. д.
Форматируем таблицу, полученную с помощью командлета Get-Member. Следует использовать следующий синтаксис:
Get-Process powershell | Get-Member | Format-Table -AutoSize -Wrap -GroupBy MemberType -Property Name, Definition

Разберем параметры командлета Format-Table:
-AutoSizeвыравнивает ширину столбцов в соответствии с размерами их содержимого. Это позволяет оптимально использовать ширину экрана.-Wrapпереносит содержимое ячейки на новую строку, если оно не помещается в текущих размерах экрана. По умолчанию, если текст не помещается, он обрезается.-GroupByпозволяет разделить одну таблицу на несколько, сгруппированных по значению определенного свойства. В данном случае, для каждого значенияMemberTypeбудет создана отдельная таблица.-Propertyопределяет, какие свойства объекта будут отображены в таблице в качестве столбцов. В данном примере, мы указали свойстваNameиDefinition.
Эти параметры позволяют настраивать внешний вид таблицы, сделать вывод более читабельным и структурированным.
Сортировка таблиц с помощью конвейеров
Командлет Sort-Object в PowerShell позволяет сортировать список объектов (таблицу) по значениям их свойств (столбцов). Давайте отсортируем результат, полученный с помощью командлета Get-Member, по столбцу Name в алфавитном порядке. Для этого воспользуемся параметром -Property, который действует аналогично параметру у командлета Format-Table:
Get-Process powershell | Get-Member | Sort-Object -Property Name

Командлет Sort-Object в PowerShell имеет также другие полезные параметры:
-Descendingсортирует объекты в порядке убывания. Например:
Get-Process powershell | Get-Member | Sort-Object -Property Name -Descending
-Uniqueудаляет дубликаты и возвращает только уникальные объекты. Например:
Get-Process powershell | Get-Member | Sort-Object -Property Name -Unique
- Параметр
-Topполучает число N и отображает первые N объектов в таблице. Например:
Get-Process | Sort-Object -Property CPU -Top 10
- Параметр
-Bottomполучает число N и отображает последние N объектов в таблице. Например:
Get-Process | Sort-Object -Property Memory -Descending -Bottom 5
Эти параметры позволяют более гибко настраивать сортировку и отображение объектов в выводе.
Логические операторы
В PowerShell вы также можете выполнять арифметические операции над объектами и строками, сравнивать их друг с другом, используя логические операторы.
+— сложение;-— вычитание;*— умножение;/— деление;%— деление по модулю;(и)— скобки для группировки операций.
Операторы сравнения оформляются так же, как параметры командлетов, и их названия произошли от английских выражений, указанных в скобках:
-eq— равно (от «equal»);-ne— не равно (от «not equal»);-gt— больше (от «greater than»);-ge— больше либо равно (от «greater than or equal»);-lt— меньше (от «less than»);-le— меньше либо равно (от «less than or equal»).
Работа со строками в PowerShell
PowerShell — мощный инструмент для автоматизации задач на платформе Windows. Работа со строками играет важную роль при обработке текстовых данных. Вот некоторые ключевые аспекты:
- Объединение строк: Чтобы объединить строки, используйте оператор
+или метод.Concat(). Пример:
$firstString = "Привет, " $secondString = "мир!" $combinedString = $firstString + $secondString
- Форматирование строк: Используйте оператор
-fили метод.Format()для вставки значений в строку. Пример:
$name = "Alice"
$age = 30
$formattedString = "Привет, меня зовут {0} и мне {1} лет." -f $name, $age- Интерполяция строк: С помощью символа
$и фигурных скобок{}можно вставлять значения переменных в строки. Пример:
$city = "Москва" $interpolatedString = "Я живу в городе $($city)."
- Разделение строк: Метод
.Split()используется для разделения строки на подстроки. Пример:
$text = "яблоко,груша,банан"
$fruits = $text.Split(",")- Замена подстрок: С помощью метода
.Replace()можно заменить подстроку в строке. Пример:
$text = "Привет, мир!"
$modifiedText = $text.Replace("мир", "вселенная")- Обрезка строк: Методы
.Trim(),.TrimStart()и.TrimEnd()удаляют пробелы и другие символы в начале и конце строки.
Примеры использования методов для обрезки строк в PowerShell:
# Обрезка пробелов в начале и конце строки $rawString = " Пример строки с пробелами " $trimmedString = $rawString.Trim() Write-Host "Исходная строка: '$rawString'" Write-Host "Обрезанная строка: '$trimmedString'" # Обрезка только в начале строки $leftTrimmedString = $rawString.TrimStart() Write-Host "Строка после обрезки в начале: '$leftTrimmedString'" # Обрезка только в конце строки $rightTrimmedString = $rawString.TrimEnd() Write-Host "Строка после обрезки в конце: '$rightTrimmedString'"
При выполнении этого кода в консоли PowerShell вы увидите следующий вывод:
Исходная строка: ' Пример строки с пробелами '
Обрезанная строка: 'Пример строки с пробелами'
Строка после обрезки в начале: 'Пример строки с пробелами '
Строка после обрезки в конце: ' Пример строки с пробелами'В данном примере видно, как методы .Trim(), .TrimStart() и .TrimEnd() удаляют пробелы в начале и конце строки, соответственно.

