2.2.50_PowerShell_Morroz.md 20 KB

PowerShell

PowerShell — это кроссплатформенная оболочка командной строки и язык сценариев, созданная Microsoft, в первую очередь для задач автоматизации и конфигурации. Это не просто замена cmd.exe, это мощная среда, построенная на .NET. Оболочка: Интерактивная среда, где вы вводите команды и немедленно получаете результат. Язык сценариев: Позволяет писать сложные скрипты (.ps1 файлы) для автоматизации многократных задач. Платформа: Предоставляет богатый набор встроенных команд и позволяет управлять практически всеми аспектами ОС Windows, облачных сервисов (Azure, AWS), VMware, Docker и многого другого.

Эволюция

PowerShell Core (начиная с версии 6.0) стал кардинальным пересмотром архитектуры PowerShell. Основные изменения включали: Переход на .NET Core — отказ от .NET Framework открыл путь к кроссплатформенной разработке. Открытый исходный код — весь проект PowerShell Core размещён на GitHub, что способствует активному участию сообщества. Совместимость с Linux и macOS — появление возможности писать универсальные скрипты для различных операционных систем. В версии PowerShell 7 (также известной как PowerShell Core 7) был сделан акцент на повышенную совместимость с модулями Windows PowerShell, что стало важным шагом в сторону объединения усилий и устранения фрагментации.

Философия и Основные Концепции

PowerShell построен на нескольких ключевых принципах: Основан на .NET: Каждая команда в PowerShell в конечном счете взаимодействует с классами и объектами .NET Framework/.NET Core. Объектно-ориентированный: В отличие от традиционных оболочек (bash, cmd), которые работают с текстом, PowerShell работает с объектами, имеющими свойства и методы. Единообразие: Имена команд следуют единому шаблону Глагол-Существительное (например, Get-Service, Stop-Process). Открытость и Расширяемость: Легко создавать свои собственные команды, модули и провайдеры.

Что такое командлет?

В основе взаимодействия с PowerShell лежат объекты, а не текст, как у CMD.EXE и командных интерпретаторов в *nix-системах. Такой подход меняет взгляд на организацию встроенных команд. Командлет — это встроенная команда в PowerShell, выполняющая одну задачу и реализованная на .NET. Имя командлета соответствует правилу Глагол-Существительное, которое можно читать как Действие-Объект. Самый важный командлет, о котором необходимо узнать в первую очередь, — Get-Help. Он отображает справочную информацию о PowerShell и командлетах. Получить общую справку по PowerShell Get-Help Получить справку по командлету Get-Content Get-Help Get-Content Получить справку по командлету Get-Help Get-Help Get-Help Если вам кажется, что использовать большие буквы в названии командлетов — это перебор, для вас есть хорошие новости. Все команды в PowerShell являются регистронезависимыми. Иными словами, перечисленные ниже написания эквивалентны: Get-Help Get-Help get-help get-help GET-HELP GET-HELP GeT-hElP gEt-HeLp Хотя Windows PowerShell нечувствительна к регистру в именах и параметрах, внешние программы, которые вызываются через оболочку, могут не обладать такими возможностями. В первой версии PowerShell все командлеты были реализованы на .NET, но начиная с версии 2.0 появилась возможность писать командлеты с использованием синтаксиса Power

Синтаксис

Синтаксис PowerShell похож на синтаксис других командных интерпретаторов. Сначала команда, а затем аргументы команды. Несколько команд в одной строке разделяются точкой с запятой. Рассмотрим на примере. Get-Help Get-Command -Online Данная команда откроет в браузере вкладку с описанием командлета Get-Command в базе знаний Microsoft. Разберем подробнее: Get-Help – команда, в данном случае командлет, Get-Command – первый позиционный аргумент, который передается командлету, -Online – ключ, то есть именованный аргумент. Обратите внимание, что в CMD.EXE именованные аргументы, то есть ключи, для встроенных команд начинались с символа слэш (/). У командлетов аргументы начинаются со знака минус. Использование знака / в PowerShell недопустимо и будет интерпретировано как ошибка. Хотя PowerShell во многом похож на CMD.EXE, он имеет несколько существенных отличий. Во-первых, обращение к переменным производится через символ доллар, а не через знак процента. Во-вторых, PowerShell позволяет определять функции. Например: function Get-Version {

$PSVersionTable.PSVersion

} Данный код объявит функцию Get-Version, которая обращается к системной переменной (объекту) PSVersionTable и возвращает значение поля PSVersion. Проще говоря, выводит версию PowerShell. Именование командлетов может быть неочевидным для администраторов с опытом работы с другими командными интерпретаторами. Поэтому рассмотрим основные команды Windows PowerShell.

Основные команды языка Windows PowerShell

В следующей таблице перечислены основные команды PowerShell и их аналоги в *nix-подобных системах и CMD.EXE. В версии PowerShell 7 количество командлетов превышает полторы тысячи! Get-Location (псевдоним — pwd) — pwd. Выводит путь до текущего каталога. Set-Location (псевдоним — cd) — cd. Меняет текущий каталог. Get-ChildItem (псевдоним — ls) — ls. Выводит содержимое текущего каталога. Get-ChildItem find — find. Производит поиск файлов по заданным критериям. Copy-Item (псевдоним — cp) — cp. Копирует файл. Remove-Item (псевдоним — rm) — rm. Удаляет файл. New-Item (псевдоним — mkdir) — mkdir. Создаёт каталог. New-Item touch — создаёт пустой файл. Get-Content (псевдоним — cat) — cat. Выводит файлы. Where-Object grep — производит фильтрацию. Create-Volume Format-Volume mkfs — форматирует раздел. Test-Connection (псевдоним — ping) — ping.exe. Отправляет ICMP-запросы, «пингует». Get-Help (псевдоним — man) — man. Показывает справку. После работы в консоли *nix командлет для популярного действия, смены каталога, выглядит громоздко и непривычно. К счастью, командлеты имеют псевдонимы (алиасы), которые могут не следовать правилу именования командлетов. Список известных псевдонимов можно получить с помощью командлета Get-Alias. Хотя таблица, представленная выше, значительно облегчит назначение командлетов, не стоит ожидать от командлетов поведения как в *nix-системах. Так, например, в PowerShell командлет Get-Content создан для вывода содержимого одного файла на экран, в то время как на *nix-системах утилита cat изначально использовалась для конкатенации (процесса соединения) нескольких файлов с последующим выводом на экран. Очевидно, что возможности PowerShell значительно больше, чем CMD.exe. Опытный администратор знает, что некоторые задачи из таблицы можно решить в CMD.exe, несмотря на отсутствие специальных команд. Однако эти команды требуют опыта или смекалки.

Конвейер PowerShell: особенности и параметры

По своей задумке конвейеры в PowerShell не отличаются от конвейеров в *nix-системах: они перенаправляют вывод одной команды на ввод другой. Как отмечалось ранее, в PowerShell происходит взаимодействие не с текстом, а с объектами. При выводе на экран объект трансформируется в таблицу, чтобы человеку было удобнее читать, но не всегда таблица выводит все поля объекта. Особенность конвейеров PowerShell заключается в том, что конвейер передает результат не целиком, а по одному объекту. Командлет Test-Connection выводит четыре объекта: по одному на каждый ICMP-запрос. Если подключить командлет к конвейеру, то можно увидеть подтверждение этому тезису. Воспользуемся командлетом Select-Object, чтобы выбрать колонку со временем запроса. После запуска данной команды можно наблюдать, как с некоторой задержкой печатаются пустые строки по одной.

Но как же так? Дело в том, что отображение объекта при выводе на экран не всегда соответствует имени поля в объекте. Чтобы получить полный список полей в объекте, необходимо вызвать командлет Get-Member.

Интегрированная среда разработки

Если вы запускали PowerShell через поиск, вероятно, вы могли заметить приложение Windows PowerShell ISE. PowerShell-скрипты — это текстовые файлы с расширением .ps1. Windows PowerShell ISE — это интегрированная среда сценариев PowerShell, включающая в себя: редактор PowerShell-скриптов с автодополнением, окно для интерактивного выполнения командлетов в скрипте, список доступных командлетов с поиском.

Обратите внимание, что модуль ISE предоставляет графический интерфейс для генерации аргументов командлета. Помимо генерации команд, в функции модуля также входит вызов «справочника» по командлетам, аналогичного Get-Help, только в графическом интерфейсе. После написания своего первого PowerShell-скрипта вы столкнетесь с некоторыми ограничениями. Во-первых, файл с расширением ps1 нельзя запустить «двойным кликом» по файлу. Необходимо открыть контекстное меню с помощью правой клавиши мыши и выбрать Запустить с помощью PowerShell. Непосредственное преимущество, получаемое пользователем при работе с PowerShell ISE, проистекает из общих возможностей этого продукта как оболочки. Вы получаете доступ ко многим комбинациям «горячих» клавиш и другим средствам, стандартным для графических приложений. Так, нажав комбинацию клавиш Ctrl+A, вы сможете выделить все содержимое окна, с помощью комбинации Ctrl+C — скопировать выделенный фрагмент, нажав клавиши Ctrl+X — вырезать его, а посредством комбинации клавиш Ctrl+V — вставить этот фрагмент в нужное место. Конечно, упомянутые функции не относятся к разряду новаторских технологий, но они раз за разом дают пользователю возможность экономить время и силы. Еще важнее доступность этого графического приложения. И хотя пользователи, привыкшие работать с подобными программами, вполне могут оставить упомянутые достоинства без внимания, отметим, что PowerShell ISE обеспечивает: наглядность — пользователь может видеть многие процессы обработки на панели инструментов; подсказки — графические изображения на значках, а также ярлыки, используемые для оформления меню, указывают на назначение соответствующих элементов; компактность — процесс активации элементов занимает всего лишь несколько миллисекунд.

Заключение

PowerShell представляет собой эволюционный скачок в области системного администрирования и автоматизации, кардинально меняющий подход к управлению ИТ-инфраструктурой. Рассмотренные в лекции аспекты демонстрируют, что это не просто очередная командная оболочка, а целостная экосистема для эффективного управления сложными системами. Объектно-ориентированная парадигма является фундаментальным отличием PowerShell от традиционных оболочек. Работа с объектами .NET вместо текстовых потоков устраняет необходимость сложного парсинга и делает скрипты более надежными и читаемыми. Это позволяет администраторам оперировать сложными структурами данных напрямую, что значительно повышает эффективность работы. Единая система именования командлетов по схеме "Глагол-Существительное" создает интуитивно понятный интерфейс, снижая порог входа для новичков и повышая продуктивность опытных специалистов. Консистентность именования делает код самодокументируемым и легко читаемым. Мощная конвейерная обработка обеспечивает композиционность простых команд в сложные сценарии обработки данных. Особенность передачи объектов по конвейеру "на лету" оптимизирует использование памяти и позволяет обрабатывать большие объемы данных без промежуточного хранения. Наличие интегрированной среды разработки PowerShell ISE значительно упрощает процесс создания и отладки скриптов. Автодополнение, графический интерфейс для работы с параметрами командлетов и встроенная справка делают среду доступной как для начинающих, так и для опытных разработчиков. Освоение PowerShell — это не просто изучение еще одного инструмента, а инвестиция в развитие профессиональных навыков, которые останутся востребованными в обозримом будущем. Мощь, гибкость и универсальность делают PowerShell незаменимым инструментом в арсенале современного ИТ-специалиста, позволяя решать сложные задачи управления инфраструктурой эффективно и элегантно.

Источники

https://selectel.ru/blog/basics-windows-powershell/ https://skillbox.ru/media/code/powershell-dlya-chaynikov-chto-eto-i-kak-s-nim-rabotat/