PowerShell — это программа автоматизации задач и управления конфигурацией от Microsoft , состоящая из командной строки и связанного языка сценариев . Первоначально являясь компонентом только Windows, известным как Windows PowerShell , он стал кроссплатформенным и открытым 18 августа 2016 года с появлением PowerShell Core . [5] Первый основан на .NET Framework , второй — на .NET (ранее .NET Core).
PowerShell входит в комплект всех поддерживаемых в настоящее время версий Windows , а также может быть установлен на MacOS и Linux . [5] Начиная с Windows 10 сборки 14971, PowerShell заменил командную строку (cmd.exe) и стал командной оболочкой по умолчанию для Проводника . [6] [7]
В PowerShell административные задачи обычно выполняются с помощью командлетов (произносится как комманд-летс ), которые являются специализированными классами .NET , реализующими определенную операцию. Они работают, получая доступ к данным в различных хранилищах данных, таких как файловая система или реестр Windows , которые предоставляются PowerShell через поставщиков . Сторонние разработчики могут добавлять командлеты и поставщиков в PowerShell. [8] [9] Командлеты могут использоваться скриптами, которые в свою очередь могут быть упакованы в модули. Командлеты работают в тандеме с .NET API .
Поддержка PowerShell для .NET Remoting , WS-Management , CIM и SSH позволяет администраторам выполнять административные задачи как на локальных, так и на удаленных системах Windows. PowerShell также предоставляет API хостинга , с помощью которого среда выполнения PowerShell может быть встроена в другие приложения. Затем эти приложения могут использовать функциональность PowerShell для реализации определенных операций, включая те, которые предоставляются через графический интерфейс . Эта возможность использовалась Microsoft Exchange Server 2007 для предоставления своей функциональности управления в виде командлетов и поставщиков PowerShell и реализации графических инструментов управления в виде хостов PowerShell, которые вызывают необходимые командлеты. [8] [10] Другие приложения Microsoft, включая Microsoft SQL Server 2008, также предоставляют свой интерфейс управления через командлеты PowerShell. [11]
PowerShell включает в себя собственную обширную консольную справку (похожую на man-страницы в оболочках Unix ), доступную через Get-Help
командлет. Обновленное содержимое локальной справки можно получить из Интернета через командлет Update-Help
. В качестве альтернативы справку из Интернета можно получать в каждом конкретном случае, переключившись -online
на Get-Help
.
Интерпретатор командной строки (CLI) был неотъемлемой частью большинства операционных систем Microsoft . MS-DOS и Xenix полагались почти исключительно на CLI (хотя MS-DOS 5 также поставлялась с дополнительной графической оболочкой DOS Shell .) Семейство Windows 9x поставлялось в комплекте с COMMAND.COM , средой командной строки MS-DOS. Однако семейства Windows NT и Windows CE поставлялись с новым cmd.exe , который имел сильное сходство с COMMAND.COM. Обе среды поддерживают несколько основных внутренних команд и примитивный язык сценариев ( пакетные файлы ), который можно использовать для автоматизации различных задач. Однако они не могут автоматизировать все аспекты графического пользовательского интерфейса Windows (GUI), поскольку эквиваленты операций в командной строке ограничены, а язык сценариев является элементарным.
Microsoft попыталась устранить некоторые из этих недостатков, представив Windows Script Host в 1998 году с Windows 98 и его хост на основе командной строки, cscript.exe
. Он интегрируется с движком Active Script и позволяет писать скрипты на совместимых языках, таких как JScript и VBScript , используя API, предоставляемые приложениями через компонентную объектную модель ( COM ). Его недостатки: его документация не очень доступна, и он быстро приобрел репутацию вектора уязвимости системы после того, как несколько известных компьютерных вирусов использовали слабости в его положениях безопасности. Различные версии Windows предоставляли различные интерпретаторы командной строки специального назначения (такие как netsh и WMIC ) со своими собственными наборами команд, но они не были совместимы. Windows Server 2003 далее пытался улучшить опыт командной строки, но поддержка скриптов все еще была неудовлетворительной. [12]
К концу 1990-х годов Intel обратилась к Microsoft с просьбой помочь сделать Windows, работающую на процессорах Intel, более подходящей платформой для поддержки разработки будущих процессоров Intel. В то время разработка процессоров Intel осуществлялась на компьютерах Sun Microsystems , на которых работала Solaris ( вариант Unix ) на процессорах с архитектурой RISC . Возможность запуска множества скриптов автоматизации KornShell от Intel на Windows была определена как ключевая возможность. Внутри компании Microsoft началась работа по созданию порта Korn Shell для Windows, который носил кодовое название Kermit. [13] В конечном итоге Intel перешла на платформу разработки на основе Linux , которая могла работать на процессорах Intel, что сделало проект Kermit излишним. Однако, имея полностью финансируемую команду, менеджер программы Microsoft Джеффри Сновер понял, что есть возможность создать более универсальное решение проблемы административной автоматизации Microsoft.
К 2002 году Microsoft начала разрабатывать новый подход к управлению командной строкой, включая CLI под названием Monad (также известный как Microsoft Shell или MSH). Идеи, лежащие в его основе, были опубликованы в августе 2002 года в официальном документе под названием «Манифест монад» его главным архитектором Джеффри Сновером . [14] В интервью 2017 года Сновер объясняет происхождение PowerShell, говоря, что он пытался сделать инструменты Unix доступными в Windows, что не сработало из-за « основных архитектурных различий между Windows и Linux ». В частности, он отметил, что Linux рассматривает все как текстовый файл , тогда как Windows рассматривает все как « API, возвращающий структурированные данные». Они были принципиально несовместимы, что заставило его использовать другой подход. [15]
Monad должен был стать новым расширяемым CLI со свежим дизайном, способным автоматизировать ряд основных административных задач. Microsoft впервые публично продемонстрировала Monad на конференции Professional Development Conference в Лос-Анджелесе в октябре 2003 года. Несколько месяцев спустя они открыли закрытую бета-версию, которая в конечном итоге привела к публичной бета-версии. Microsoft опубликовала первую публичную бета-версию Monad 17 июня 2005 года, Beta 2 — 11 сентября 2005 года, а Beta 3 — 10 января 2006 года.
25 апреля 2006 года, вскоре после первоначального объявления Monad, Microsoft объявила, что Monad был переименован в Windows PowerShell , позиционируя его как значительную часть своих предложений по технологиям управления. [16] Release Candidate (RC) 1 PowerShell был выпущен в то же время. Важным аспектом как смены названия, так и RC было то, что теперь это был компонент Windows, а не просто надстройка.
Release Candidate 2 PowerShell версии 1 был выпущен 26 сентября 2006 года, а окончательный релиз в Интернете состоялся 14 ноября 2006 года. PowerShell для более ранних версий Windows был выпущен 30 января 2007 года. [17] Разработка PowerShell v2.0 началась до выпуска PowerShell v1.0. Во время разработки Microsoft выпустила три предварительных версии технологий для сообщества (CTP) . Microsoft сделала эти выпуски доступными для общественности. Последняя версия CTP Windows PowerShell v2.0 была выпущена в декабре 2008 года.
PowerShell v2.0 был завершен и выпущен в производство в августе 2009 года как неотъемлемая часть Windows 7 и Windows Server 2008 R2. Версии PowerShell для Windows XP, Windows Server 2003, Windows Vista и Windows Server 2008 были выпущены в октябре 2009 года и доступны для загрузки как для 32-разрядных, так и для 64-разрядных платформ. [18] В выпуске журнала TechNet Magazine за октябрь 2009 года компания Microsoft назвала владение PowerShell «единственным наиболее важным навыком, который понадобится администратору Windows в ближайшие годы». [19]
Windows 10 поставляется с Pester, набором для проверки скриптов для PowerShell. [20]
18 августа 2016 года Microsoft объявила [21] , что они сделали PowerShell открытым исходным кодом и кроссплатформенным с поддержкой Windows, macOS , CentOS и Ubuntu . [5] Исходный код был опубликован на GitHub . [22] Переход к открытому исходному коду создал второе воплощение PowerShell под названием «PowerShell Core», которое работает на .NET Core . Оно отличается от «Windows PowerShell», которое работает на полной платформе .NET Framework . [23] Начиная с версии 5.1, PowerShell Core поставляется в комплекте с Windows Server 2016 Nano Server . [24] [25]
Ключевой тактикой проектирования PowerShell было использование большого количества API , которые уже существовали в Windows, Windows Management Instrumentation, .NET Framework и другом программном обеспечении. Командлеты PowerShell «оборачивались» вокруг существующей функциональности. Цель этой тактики — предоставить удобный для администратора, более согласованный интерфейс между администраторами и широким спектром базовых функций. С PowerShell администратору не нужно знать .NET, WMI или низкоуровневое кодирование API, и вместо этого он может сосредоточиться на использовании командлетов, предоставляемых PowerShell. В этом отношении PowerShell создает мало новых функций, вместо этого сосредотачиваясь на том, чтобы сделать существующие функции более доступными для определенной аудитории. [26]
Разработчики PowerShell основали базовую грамматику инструмента на POSIX 1003.2 KornShell . [27]
Однако на язык PowerShell также оказали влияние PHP , Perl и многие другие существующие языки. [28]
Windows PowerShell может выполнять четыре вида именованных команд: [29]
.ps1
)Если команда является автономной исполняемой программой, PowerShell запускает ее в отдельном процессе ; если это командлет, он выполняется в процессе PowerShell. PowerShell предоставляет интерактивный интерфейс командной строки , в котором можно вводить команды и отображать их вывод. Пользовательский интерфейс предлагает настраиваемое автодополнение клавишей Tab . PowerShell позволяет создавать псевдонимы для командлетов, которые PowerShell текстово транслирует в вызовы исходных команд. PowerShell поддерживает как именованные , так и позиционные параметры для команд. При выполнении командлета работа по привязке значения аргумента к параметру выполняется самим PowerShell, но для внешних исполняемых файлов аргументы анализируются внешним исполняемым файлом независимо от интерпретации PowerShell. [30]
PowerShell Extended Type System ( ETS ) основана на системе типов .NET, но с расширенной семантикой (например, propertySets и сторонняя расширяемость). Например, она позволяет создавать различные представления объектов, предоставляя только подмножество полей данных, свойств и методов, а также указывая пользовательское форматирование и поведение сортировки. Эти представления сопоставляются с исходным объектом с помощью файлов конфигурации на основе XML . [31]
Командлеты — это специализированные команды в среде PowerShell, которые реализуют определенные функции. Это собственные команды в стеке PowerShell. Командлеты следуют шаблону именования Глагол - Существительное , например Get-ChildItem , что делает его самодокументируемым кодом . [32] Командлеты выводят свои результаты в виде объектов, а также могут получать объекты в качестве входных данных, что делает их пригодными для использования в качестве получателей в конвейере. Если командлет выводит несколько объектов, каждый объект в коллекции передается вниз по всему конвейеру до обработки следующего объекта. [32]
Командлеты — это специализированные классы .NET, которые среда выполнения PowerShell создает и вызывает во время выполнения . Командлеты происходят либо от , Cmdlet
либо от PSCmdlet
, причем последний используется, когда командлету необходимо взаимодействовать со средой выполнения PowerShell. [32] Эти базовые классы определяют определенные методы — BeginProcessing()
, ProcessRecord()
и EndProcessing()
— , которые реализация командлета переопределяет для предоставления функциональности. Всякий раз, когда запускается командлет, PowerShell вызывает эти методы последовательно, причем ProcessRecord()
вызывается, если он получает входные данные конвейера. [33] Если передается коллекция объектов, метод вызывается для каждого объекта в коллекции. Класс, реализующий командлет, должен иметь один атрибут .NET — CmdletAttribute
— , который указывает глагол и существительное, составляющие имя командлета. Общие глаголы предоставляются в виде перечисления . [ 34] [35]
Если командлет получает либо входные данные конвейера, либо входные данные параметра командной строки, в классе должно быть соответствующее свойство с реализацией мутатора . PowerShell вызывает мутатор со значением параметра или входными данными конвейера, которые сохраняются реализацией мутатора в переменных класса. Затем на эти значения ссылаются методы, реализующие функциональность. Свойства, которые сопоставляются с параметрами командной строки, отмечены ParameterAttribute
[36] и устанавливаются перед вызовом BeginProcessing()
. Те, которые сопоставляются с входными данными конвейера, также отмечены ParameterAttribute
, но с ValueFromPipeline
установленным параметром атрибута. [37]
Реализация этих классов командлетов может ссылаться на любой API .NET и может быть на любом языке .NET . Кроме того, PowerShell делает доступными определенные API, такие как , который используется для доступа к специфичным для PowerShell функциям, таким как запись результирующих объектов в конвейер. Командлеты могут напрямую использовать API доступа к данным .NET или использовать инфраструктуру PowerShell поставщиков PowerShell , которые делают хранилища данных адресуемыми с использованием уникальных путей . Хранилища данных предоставляются с использованием букв дисков и иерархий внутри них, адресуемых как каталоги. Windows PowerShell поставляется с поставщиками для файловой системы , реестра , хранилища сертификатов , а также пространств имен для псевдонимов команд, переменных и функций. [38] Windows PowerShell также включает различные командлеты для управления различными системами Windows , включая файловую систему , или с использованием инструментария управления Windows для управления компонентами Windows . Другие приложения могут регистрировать командлеты с помощью PowerShell, тем самым позволяя ему управлять ими, и, если они включают в себя какое-либо хранилище данных (например, базу данных), они также могут добавлять определенных поставщиков. [ необходима цитата ]WriteObject()
Количество командлетов, включенных в базовую установку PowerShell, в целом увеличивается с каждой версией:
Командлеты можно добавлять в оболочку с помощью оснасток (устарело в версии 2) и модулей; пользователи не ограничены командлетами, включенными в базовую установку PowerShell.
PowerShell реализует концепцию конвейера , которая позволяет передавать выходные данные одного командлета другому командлету в качестве входных данных. Как и конвейеры Unix , конвейеры PowerShell могут создавать сложные команды, используя |
оператор для соединения этапов. Однако конвейер PowerShell отличается от конвейеров Unix тем, что этапы выполняются в среде выполнения PowerShell, а не как набор процессов, координируемых операционной системой . Кроме того, структурированные объекты .NET, а не потоки байтов , передаются с одного этапа на другой. Использование объектов и выполнение этапов в среде выполнения PowerShell устраняет необходимость сериализации структур данных или их извлечения путем явного анализа текстового вывода. [43] Объект также может инкапсулировать определенные функции, которые работают с содержащимися данными, которые становятся доступными для использования командой-получателем. [44] [45] Для последнего командлета в конвейере PowerShell автоматически передает свой выходной объект командлету Out-Default
, который преобразует объекты в поток объектов формата, а затем отображает их на экране. [46] [47]
Поскольку все объекты PowerShell являются объектами .NET, они совместно используют .ToString()
метод, который извлекает текстовое представление данных в объекте. Кроме того, PowerShell позволяет указывать определения форматирования, поэтому текстовое представление объектов можно настраивать, выбирая, какие элементы данных отображать и каким образом. Однако для поддержания обратной совместимости , если внешний исполняемый файл используется в конвейере, он получает текстовый поток, представляющий объект, вместо прямой интеграции с системой типов PowerShell. [48] [49] [50]
Windows PowerShell включает динамически типизированный язык сценариев , который может реализовывать сложные операции с использованием командлетов императивно . Язык сценариев поддерживает переменные, функции, ветвление ( if-then-else
), циклы ( while
, do
, for
, и foreach
), структурированную обработку ошибок/исключений и замыкания / лямбда-выражения [51] , а также интеграцию с .NET. Переменные в сценариях PowerShell имеют префикс $
. Переменным можно присваивать любое значение, включая вывод командлетов. Строки можно заключать как в одинарные, так и в двойные кавычки: при использовании двойных кавычек переменные будут расширяться, даже если они находятся внутри кавычек. Заключение пути к файлу в фигурные скобки с предшествующим знаком доллара (как в ${C:\foo.txt}
) создает ссылку на содержимое файла. Если он используется как L-значение , все, что ему назначено, будет записано в файл. При использовании как R-значение , содержимое файла будет прочитано. Если назначен объект, он сериализуется перед сохранением. [ необходима ссылка ]
Доступ к членам объекта можно получить с помощью .
нотации, как в синтаксисе C#. PowerShell предоставляет специальные переменные, такие как $args
, которая является массивом всех аргументов командной строки, переданных функции из командной строки, и $_
, которая ссылается на текущий объект в конвейере. [52] PowerShell также предоставляет массивы и ассоциативные массивы . Язык сценариев PowerShell также немедленно оценивает арифметические выражения, введенные в командной строке, и анализирует общие сокращения, такие как ГБ, МБ и КБ. [53] [54]
Используя function
ключевое слово PowerShell обеспечивает создание функций. Простая функция имеет следующий общий вид: [55]
имя функции ( [Тип] $Param1 , [Тип] $Param2 ) { # Инструкции }
Однако PowerShell допускает расширенные функции, которые поддерживают именованные параметры, позиционные параметры, параметры переключения и динамические параметры. [55]
функция Глагол-Существительное { параметр ( # Определение статических параметров ) динамическийпараметр { # Определение динамических параметров } начинать { # Набор инструкций для запуска в начале конвейера } процесс { # Основные наборы инструкций, выполняемые для каждого элемента в конвейере } конец { # Набор инструкций для запуска в конце конвейера }}
Определенная функция вызывается в одной из следующих форм: [55]
имя значение1 значение2 Глагол-Существительное -Парам1 значение1 -Парам2 значение2
PowerShell позволяет вызывать любые статические методы .NET, указав их пространства имен, заключенные в скобки ( []
), а затем используя пару двоеточий ( ::
) для указания статического метода. [56] Например:
[Консоль] :: WriteLine ( "PowerShell" )
Существуют десятки способов создания объектов в PowerShell. После создания можно получить доступ к свойствам и методам экземпляра объекта, используя .
нотацию. [56]
PowerShell принимает строки , как необработанные, так и экранированные . Строка, заключенная в одинарные кавычки, является необработанной строкой, а строка, заключенная в двойные кавычки, является экранированной строкой. PowerShell рассматривает прямые и фигурные кавычки как эквивалентные. [57]
PowerShell поддерживает следующий список специальных символов: [58]
Для обработки ошибок PowerShell предоставляет механизм обработки исключений на основе .NET . В случае ошибок Exception
выбрасываются объекты, содержащие информацию об ошибке (объект), которые перехватываются с помощью try ... catch
конструкции (хотя trap
конструкция также поддерживается). PowerShell можно настроить на молчаливое возобновление выполнения, без фактического выбрасывания исключения; это можно сделать либо в одной команде, в одном сеансе, либо постоянно. [59]
Скрипты, написанные с использованием PowerShell, могут сохраняться между сеансами в .ps1
файле или .psm1
файле (последний используется для реализации модуля). Позже можно использовать либо весь скрипт, либо отдельные функции в скрипте. Скрипты и функции работают аналогично командлетам, в том смысле, что их можно использовать как команды в конвейерах, а параметры можно привязывать к ним. Объекты конвейера можно передавать между функциями, скриптами и командлетами бесшовно. Чтобы предотвратить непреднамеренный запуск скриптов, выполнение скрипта по умолчанию отключено и должно быть включено явно. [60] Включение скриптов может выполняться на уровне системы, пользователя или сеанса. Скрипты PowerShell могут быть подписаны для проверки их целостности и подлежат Code Access Security . [61]
Язык сценариев PowerShell поддерживает двоичную префиксную нотацию, похожую на научную нотацию, поддерживаемую многими языками программирования семейства C. [62]
Можно также использовать PowerShell, встроенный в приложение управления, которое использует среду выполнения PowerShell для реализации функциональности управления. Для этого PowerShell предоставляет управляемый API хостинга . С помощью API приложение может создать экземпляр пространства выполнения (один экземпляр среды выполнения PowerShell), который запускается в процессе приложения и отображается как Runspace
объект. [8] Состояние пространства выполнения заключено в SessionState
объект. Когда создается пространство выполнения, среда выполнения Windows PowerShell инициализирует экземпляр, включая инициализацию поставщиков и перечисление командлетов, и обновляет объект SessionState
соответствующим образом. Затем пространство выполнения должно быть открыто либо для синхронной обработки, либо для асинхронной обработки. После этого его можно использовать для выполнения команд. [ необходима цитата ]
Для выполнения команды Pipeline
необходимо создать конвейер (представленный объектом) и связать его с пространством выполнения. Затем объект конвейера заполняется командлетами, составляющими конвейер. Для последовательных операций (как в скрипте PowerShell) для каждого оператора создается объект Pipeline, который вкладывается в другой объект Pipeline. [8] Когда создается конвейер, Windows PowerShell вызывает процессор конвейера, который преобразует командлеты в соответствующие сборки ( командный процессор ), добавляет ссылку на них в конвейер и связывает их с объектами InputPipe
, OutputPipe
и ErrorOutputPipe
, чтобы представить соединение с конвейером. Типы проверяются, а параметры привязываются с помощью отражения . [8] После настройки конвейера хост вызывает Invoke()
метод для запуска команд или его асинхронный эквивалент . InvokeAsync()
Если Write-Host
в конце конвейера есть командлет, он выводит результат на экран консоли. Если нет, результаты передаются хосту, который может либо применить дальнейшую обработку, либо отобразить сам вывод. [ требуется цитата ]
Microsoft Exchange Server 2007 использует API хостинга для предоставления своего графического интерфейса управления. Каждая операция, представленная в графическом интерфейсе, сопоставляется с последовательностью команд PowerShell (или конвейеров). Хост создает конвейер и выполняет их. Фактически, сама интерактивная консоль PowerShell является хостом PowerShell, который интерпретирует скрипты, введенные в командной строке, создает необходимые Pipeline
объекты и вызывает их. [ необходима цитата ]
DSC позволяет декларативно указать, как должна быть настроена программная среда. [63]
При запуске конфигурации DSC гарантирует, что система получит состояние, описанное в конфигурации. Конфигурации DSC являются идемпотентными. Локальный менеджер конфигурации (LCM) периодически опрашивает систему, используя поток управления, описанный ресурсами (императивные части DSC), чтобы убедиться, что состояние конфигурации поддерживается.
Первоначально использовавший кодовое имя «Monad», PowerShell был впервые представлен публике на конференции Professional Developers Conference в октябре 2003 года в Лос-Анджелесе. Все основные выпуски по-прежнему поддерживаются, и каждый основной выпуск имеет обратную совместимость с предыдущими версиями.
PowerShell 1.0 был выпущен в ноябре 2006 года для Windows XP SP2 , Windows Server 2003 SP1 и Windows Vista . [64] Это необязательный компонент Windows Server 2008 .
PowerShell 2.0 интегрирован с Windows 7 и Windows Server 2008 R2 [65] и выпущен для Windows XP с пакетом обновления 3, Windows Server 2003 с пакетом обновления 2 и Windows Vista с пакетом обновления 1. [66] [67]
PowerShell v2 включает изменения в языке сценариев и API хостинга, а также включает более 240 новых командлетов. [68] [69]
Новые возможности PowerShell 2.0 включают: [70] [71] [72]
BeginProcessing()
, ProcessRecord()
и .EndProcessing()
Out-GridView
, которые отображают табличные данные в объекте WPF GridView в системах, которые это поддерживают, и если установлен и включен ISE.-Split
, , и операторы -Join
Splatting ( ).@
<#
и #>
в качестве разделителей. [76]RunspacePools
), а также возможность создания ограниченных Runspaces , которые позволяют вызывать только настроенное подмножество PowerShell. Новые API также поддерживают участие в транзакции, управляемой PowerShellPowerShell 3.0 интегрирован с Windows 8 и Windows Server 2012. Microsoft также сделала PowerShell 3.0 доступным для Windows 7 с пакетом обновления 1, для Windows Server 2008 с пакетом обновления 1 и для Windows Server 2008 R2 с пакетом обновления 1. [77] [78]
PowerShell 3.0 является частью более крупного пакета Windows Management Framework 3.0 (WMF3), который также содержит службу WinRM для поддержки удаленного взаимодействия. [78] Microsoft выпустила несколько выпусков Community Technology Preview WMF3. Ранняя версия Community Technology Preview 2 (CTP 2) Windows Management Framework 3.0 была выпущена 2 декабря 2011 года. [79] Windows Management Framework 3.0 был выпущен для широкой публики в декабре 2012 года [80] и включен в Windows 8 и Windows Server 2012 по умолчанию. [81]
Новые возможности PowerShell 3.0 включают: [78] [82] : 33–34
get-WmiObject win32_logicaldisk
, томами, брандмауэрами, сетевыми подключениями и принтерами, которые ранее выполнялись через WMI. [ необходимо дополнительное объяснение ]PowerShell 4.0 интегрирован с Windows 8.1 и Windows Server 2012 R2 . Microsoft также сделала PowerShell 4.0 доступным для Windows 7 SP1 , Windows Server 2008 R2 SP1 и Windows Server 2012. [ 83]
Новые возможности PowerShell 4.0 включают:
RemoteSigned
.Windows Management Framework (WMF) 5.0 RTM, включающий PowerShell 5.0, был повторно выпущен в Интернете 24 февраля 2016 года после первоначального выпуска с серьезной ошибкой. [87]
Основные характеристики включают:
class
ключевое слово , создающее классы для объектно-ориентированного программированияenum
ключевое слово, создающее перечисленияOneGet
Командлеты для поддержки менеджера пакетов Chocolatey [88]Он был выпущен вместе с Windows 10 Anniversary Update [90] 2 августа 2016 года и в Windows Server 2016. [ 91] PackageManagement теперь поддерживает прокси, PSReadLine теперь имеет поддержку ViMode, и были добавлены два новых командлета: Get-TimeZone и Set-TimeZone. Модуль LocalAccounts позволяет добавлять/удалять локальные учетные записи пользователей. [92] Предварительная версия PowerShell 5.1 была выпущена для Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 и Windows Server 2012 R2 16 июля 2016 года [93] и была выпущена 19 января 2017 года. [94]
PowerShell 5.1 — первая версия, представленная в двух редакциях «Desktop» и «Core». Редакция «Desktop» является продолжением традиционной Windows PowerShell, работающей на стеке .NET Framework. Редакция «Core» работает на .NET Core и поставляется в комплекте с Windows Server 2016 Nano Server. В обмен на меньший размер в последней отсутствуют некоторые функции, такие как командлеты для управления буфером обмена или присоединения компьютера к домену, командлеты WMI версии 1, командлеты журнала событий и профили. [25] Это была последняя версия PowerShell, созданная исключительно для Windows. Windows PowerShell 5.1 остается предустановленной в Windows 10, Windows 11 и Windows Server 2022, в то время как .NET PowerShell необходимо устанавливать отдельно, и она может работать параллельно с Windows PowerShell. [95] [96]
PowerShell Core 6.0 был впервые анонсирован 18 августа 2016 года, когда Microsoft представила PowerShell Core и свое решение сделать продукт кроссплатформенным , независимым от Windows, бесплатным и с открытым исходным кодом. [5] Он стал общедоступным 10 января 2018 года для Windows, macOS и Linux . [97] Он имеет собственный жизненный цикл поддержки и придерживается политики жизненного цикла Microsoft, введенной в Windows 10: поддерживается только последняя версия PowerShell Core. Microsoft планирует выпускать одну второстепенную версию для PowerShell Core 6.0 каждые шесть месяцев. [98]
Самым значительным изменением в этой версии PowerShell является расширение на другие платформы. Для администраторов Windows эта версия PowerShell не включала никаких новых важных функций. В интервью с сообществом 11 января 2018 года команду PowerShell попросили перечислить 10 самых захватывающих вещей, которые произойдут для ИТ-специалиста Windows, который перейдет с Windows PowerShell 5.1 на PowerShell Core 6.0; в ответ Энджел Кальво из Microsoft смог назвать только две: кроссплатформенность и открытый исходный код. [99] PowerShell 6 изменил кодировку на UTF-8 в качестве кодировки по умолчанию, за некоторыми исключениями. [100] (PowerShell 7.4 больше меняет на UTF-8) [101]
По данным Microsoft, одной из новых функций PowerShell 6.1 является «Совместимость с более чем 1900 существующими командлетами в Windows 10 и Windows Server 2019 ». [102] Тем не менее, никаких подробностей об этих командлетах в полной версии журнала изменений найти нельзя. [103] Позже Microsoft заявляет, что этого числа было недостаточно, поскольку PowerShell Core не смог заменить Windows PowerShell 5.1 и завоевать популярность в Windows. [104] Однако он был популярен в Linux. [104]
PowerShell Core 6.2 в первую очередь ориентирован на улучшение производительности, исправление ошибок, а также на небольшие улучшения командлетов и языка, которые повысили производительность разработчиков. [105]
PowerShell 7 является заменой продуктов PowerShell Core 6.x, а также Windows PowerShell 5.1, которая является последней поддерживаемой версией Windows PowerShell. [106] [104] Основное внимание при разработке было уделено тому, чтобы сделать PowerShell 7 жизнеспособной заменой Windows PowerShell 5.1, то есть иметь почти такой же уровень совместимости с модулями, которые поставляются с Windows. [107]
Новые функции PowerShell 7 включают: [108]
-Parallel
для ForEach-Object
командлета, помогающий управлять параллельной обработкойGet-Error
&&
и ||
), которые позволяют условно выполнить следующий командлет в конвейере??
для объединения нулей??=
для присваивания нулевого объединенияInvoke-DscResource
(экспериментальный)Out-GridView
командлета-ShowWindow
дляGet-Help
PowerShell 7.2 — это следующая версия PowerShell с долгосрочной поддержкой после версии 7.0. Она использует .NET 6.0 и включает универсальные установочные пакеты для Linux. В Windows обновления PowerShell 7.2 и более поздних версий поступают через службу Microsoft Update ; эта функция отсутствовала в PowerShell 6.0 по 7.1. [109]
Эта версия включает в себя некоторые общие обновления и исправления командлетов, тестирование пакетов, зависящих от фреймворка, в конвейере выпуска, а также улучшения сборки и упаковки. [110]
PowerShell 7.4 основан на .NET 8. И с этим выпуском веб-командлеты по умолчанию используют кодировку UTF-8 (изменяя ASCII -надмножество Windows-1252, также известное как ISO-8859-1 , которое не поддерживает Unicode ). [111] [101] Ранее UTF-8 использовалось по умолчанию для других, но не для всех вещей.
В следующей таблице содержится выборка командлетов, которые поставляются с PowerShell, с указанием похожих команд в других известных интерпретаторах командной строки. Многие из этих похожих команд изначально определены как псевдонимы в PowerShell, что позволяет людям, знакомым с другими распространенными оболочками, легко начать работу.
Примечания
ls
и man
псевдонимы отсутствуют в версии PowerShell Core для Linux.curl
и wget
псевдонимы отсутствуют в PowerShell Core, чтобы не мешать вызову одноименных собственных команд.Проект под названием Pash , игра слов на широко известном " bash " Unix shell, был открытым исходным кодом и кроссплатформенной реимплементацией PowerShell через фреймворк Mono . [140] Pash был создан Игорем Мучником, написан на C# и выпущен под лицензией GNU General Public License . Разработка Pash застопорилась в 2008 году, была возобновлена на GitHub в 2012 году, [141] и окончательно прекращена в 2016 году, когда PowerShell был официально сделан открытым исходным кодом и кроссплатформенным. [142]
Отличительной особенностью здесь является то, что практически все утилиты администрирования теперь работают из командной строки (и большинство из них доступны через telnet).
Основной язык PowerShell основан на грамматике POSIX 1003.2 для оболочки Korn .
Windows PowerShell 3.0 поставляется с примерно 1000 командлетами в Windows 8
Windows PowerShell 5.0 поставляется с примерно 1300 командлетами в Windows 10
Кодировка по умолчанию — UTF-8 без BOM, за исключением New-ModuleManifest