company_banner

PowerShell — это язык программирования?

Автор оригинала: Graeme John
  • Перевод
Является ли PowerShell языком программирования? Совершенно определённо — является. И не обращайте внимание на тех, кто говорит, что это не так. Многие, работающие в сфере программирования, могут просто посмеяться над мыслью о том, что код, написанный для PowerShell — это нечто большее, чем обычные скрипты. Такие люди категорически неправы. Здесь мы поговорим о том, почему это так. Но если вы читаете этот текст в поиске чёткого ответа, то знайте — PowerShell — это язык программирования. Более того, PowerShell — это поразительный инструмент, который позволяет решать практически любые задачи. С помощью PowerShell можно сделать что-то простое, такое, что обычно делают в командной строке Windows (CMD), а можно, используя Windows Forms, построить полномасштабное приложение. Границы того, что можно создать с помощью PowerShell, ограничены лишь фантазией разработчика и его навыками поиска в интернете.



Здесь мы пройдёмся по некоторым вопросам о PowerShell, которые возникают у людей чаще всего. Особое внимание мы уделим вопросу о том, можно ли считать PowerShell языком программирования. Я работал с PowerShell много лет, но не могу сказать, что освоил хотя бы малую часть возможностей этой системы. Поэтому я, приступая к работе над этим материалом, уверен в том, что и я, и тот, кто будет этот материал читать, узнаем много нового об этом фантастическом инструменте. Ну и, конечно, я надеюсь, что мне удастся чётко ответить на вопрос о том, является ли PowerShell языком программирования.

Зачем вообще учиться программировать?


Я полагаю, что в заголовок этого раздела вынесен хороший вопрос. Зачем учиться программировать? Ведь это очень сложно, а полученные знания и навыки, вероятно, не пригодятся IT-специалисту в обычной работе. Тот, кто думает, что так оно и есть, глубоко ошибается. В наши дни научиться программировать как никогда просто, при этом конкретная сфера деятельности того, кто учится программировать, особой роли не играет.

Благодаря поисковику Google и видеохостингу YouTube (это, соответственно, первый и второй по посещаемости сайты в мире) в нашем распоряжении имеются нескончаемые запасы бесплатных и хорошо подготовленных учебных материалов. Если тому, кто хочет изучить некий язык программирования, попадётся хороший курс, то он меньше чем за час (в буквальном смысле) сможет настроить среду разработки и написать свой первый «Hello World». На следующем рисунке можно видеть «Hello World» на PowerShell.


«Hello World» на PowerShell — это очень просто

Может, изучая программирование, вы подумываете о продвижении по карьерной лестнице и считаете, что знания из сферы DevOps — это как раз то, что вам нужно. Ведущие языки программирования для DevOps — это Golang, Python, Ruby, C#… Данный список можно продолжать и продолжать (и в этот список, пожалуй, можно включить практически все актуальные языки программирования).

Есть масса причин для того чтобы учиться тому, как писать программы. Может, кому-то всегда хотелось сделать веб-приложение для организации, где он работает. А может — кто-то мечтает написать успешную мобильную игру, которая обеспечит его на всю оставшуюся жизнь. Возможно, что кому-то просто хотелось бы автоматизировать свои рутинные задачи и высвободить время, которое он, быстрее справляясь со своими обязанностями, сможет потратить на просмотр видео с котами. Умение программировать делает всё это возможным.

Что такое язык программирования?


Прежде чем называть PowerShell «языком программирования» или «средой для разработки скриптов», нам, вероятно, надо сначала разобраться с тем, что такое «язык программирования». Если говорить простыми словами, то язык программирования — это последовательность наборов инструкций, которые взаимодействуют с компьютерной системой.

Эти инструкции можно воспринимать как способ объяснения компьютеру того, чего от него хочет человек. При этом — такой способ, который не требует от человека изучения ассемблера или низкоуровневого программирования в машинных кодах с использованием шестнадцатеричных и двоичных конструкций (правда, кое-кто свободно владеет подобными методами «общения» с компьютерами; мы выражаем таким людям своё почтение!).

Существуют разные виды языков программирования. Кратко опишем их:

  • Процедурные языки программирования. В них код выполняется линейно и пошагово. Это означает, что если некто создал приложение, то код этого приложения должен выполниться от начала до конца, после чего его работа завершается. А если при выполнении этого кода возникнут какие-то проблемы — его выполнение должно быть прервано.
  • Функциональные языки программирования. Тут используются символические представления вычислений. В таких языках применяются конструкции, которые не особенно сильно отличаются от математических функций.
  • Объектно-ориентированные языки программирования. В этих языках типы данных могут содержать как данные, в форме атрибутов и свойств объектов, так и функции, манипулирующие этими данными.
  • Скриптовые языки программирования. Для запуска кода, написанного на таких языках, не нужен компилятор. Они используют так называемые «интерпретаторы». При написании программ на этих языках применяются предварительно подготовленные команды и функции, хотя подход к созданию программ на таких языках похож на подход, используемый при работе со «стандартными» языками.
  • Логические языки программирования. В логических языках программирования используются (вот уж неожиданность) правила логики. Они позволяют, оперируя фактами и заданными правилами, автоматически выводить результат.

Тут, конечно, языки программирования охарактеризованы очень сжато, но я полагаю, что мы, во-первых, перечислили самые популярные виды языков программирования, а во-вторых, в общих чертах описали их суть. А теперь давайте разберёмся с тем, что такое PowerShell, и с тем, является ли PowerShell языком программирования.

Суть PowerShell


До PowerShell в мире Microsoft Windows существовал VBScript. Используя этот язык программирования можно решить очень большое количество задач, но в наше время, в 2021 году, вероятно, это «количество» примерно равно количеству задач, нерешаемых с помощью VBScript. Инструмент PowerShell создавался как средство, которое поможет использовать всё лучшее, что есть в платформе .NET, и при этом будет иметь доступ ко встроенным возможностям ОС. Джеффри Сновер, человек, который придумал PowerShell, на самом деле, очень подробно об этом рассказывает в работе Monad Manifesto, которую он написал в 2002 году. Это — захватывающее чтение, в этом материале чётко выражено его видение проекта, который в итоге и стал тем, что получило название «PowerShell».

Проект PowerShell, с момента его появления, почти 20 лет стремительно развивался. То, что проект этот достиг уровня зрелости, очевидно для всех, кто им пользуется, и кто полагается на него в решении своих ежедневных задач, вне зависимости от того, что именно это за задачи. Существует обширный набор так называемых «командлетов», которые поддерживаются их создателями в актуальном состоянии и дают тому, кому это нужно, постоянно пополняемый набор гибких и мощных инструментов.

И всё же, PowerShell — это язык программирования или нет?


Можно ли отнести PowerShell к какому-то из вышеописанных видов языков программирования? Возможно, вы уже пришли к выводу о том, что PowerShell, на самом деле, подпадает под несколько категорий языков программирования. Пуристы отвергнут идею о том, что PowerShell — это полноправный язык программирования, и я даже вижу причину такого видения ситуации.

PowerShell полагается на системные хуки ОС Windows для выполнения множества встроенных команд, или, как их называют в PowerShell-сообществе, «командлетов» (так что этот термин придумал не я). Каждый из командлетов способен выполнить некую очень полезную, или, в некоторых случаях, очень мощную операцию.

В PowerShell для организации обмена переменными и данными используются объекты. Поэтому можно сказать, что тут используются идеи, роднящие PowerShell с объектно-ориентированными языками программирования. Многие считают PowerShell скриптовым языком программирования. А это, что невозможно не признать, во многих отношениях так и есть. Но PowerShell-код может работать и как код обычных приложений. Этот код, как и программы, написанные на том же Python, или на ещё каком-то распространённом языке, может включать в себя циклы, вроде foreach и while, условные конструкции и многое другое.

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

Если говорить серьёзнее, то PowerShell может оказать компьютерщику огромную помощь, и речь идёт не только о решении рабочих задач. Например, я хочу написать цикл материалов о том, как я создал простое Windows Form-приложение для моей мамы, которой уже за 70. Это приложение позволяет ей переключать настройки почтового сервера в путешествиях (до того, как мир охватило то, что происходит сейчас) буквально несколькими щелчками мыши.

Я надеюсь, что этот небольшой проект вдохновит на создание чего-то похожего тех, кто никогда ничего такого делать не пытался, и что процесс создания своего проекта принесёт им много положительных эмоций. Поэтому, если вам это интересно, можете иногда заглядывать в список моих публикаций. А вот — материал о том, как узнать версию PowerShell в Windows 10.

Полагаю, мы справились с нашей задачей. Мы выяснили, что PowerShell — это язык программирования, но вряд ли он будет основным языком, на котором пишет некий программист. Высоки шансы того, что тот, кто недавно узнал о PowerShell, воспользуется несколькими мощными скриптами для решения неких задач бэкенда своего приложения. Но реальность такова, что у скомпилированных приложений, запускающихся в операционной системе, есть преимущества в производительности перед хуками, используемыми в командной оболочке ОС Windows.

Итоги


Надеюсь, вы вынесли что-то полезное из этой нашей небольшой вылазки в мир языков программирования. Я не считаю себя экспертом ни в одной из тех областей, которых коснулся в этом материале. Я — энтузиаст, который хочет учиться новому. Я думаю, что главное, что можно вынести из чего-то вроде изучения программирования, скриптов, автоматизации, это желание осваивать новые навыки и развиваться.

Это — тот сорт любознательности, который, в итоге, поможет своему обладателю больше узнать о системах, с которыми он работает, поможет создать для этих систем что-то полезное, такое, что облегчит ему решение его повседневных задач. А если снова вернуться к вопросу о том, является ли PowerShell языком программирования, то я полагаю, что на этот вопрос совершенно спокойно можно ответить утвердительно.

Какие задачи вы решаете с помощью PowerShell?

RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Комментарии 35

    +3
    PowerShell был создан как попытка замены неудобоваримого CMD для чайников и, одновременно, прибить наконец костыль REXX, как неканоничный. Получилось то, что получилось. Но большинство решаемых с его помощью задач вполне реализуемы в рамках CMD (нетривиально) и REXX (не поддерживается в современных виндах).

    P.S. Язык ли он программирования? В равной степени, как и другой скриптовый, просто со своеобразным применением, что свойственно им всем.
      +2
      Довольно странная формулировка поста.
      Главный вопрос, который возникает при чтении статьи так и остался без ответа:

      Чем PowerShell поможет мне в конкретных прикладных задачах, и при каких условиях стоит выбирать его вместо того же C#?
      Например, у меня была необходимость написать некоторую программу на компьютере с максимально урезанными правами. Так что мне пришлось воспользоваться банальной IDE из пакета MS офиса с встроенным VisualBasic.
        +2
        Какая разница является или нет?
        Задачи решает? Решает. А кто как называет его «скриптовый язык» или «язык программирования» или «средство управления» вопрос десятый. Не спорьте о терминах, а договаривайтесь о них.
          +1
          PowerShell может использовать классы .Net, так что по потенциальным возможностям он не уступает C#. Но в первую очередь это всё же командный процессор, призванный заменить CMD (при этом сохраняя частичную совместимость команд). То есть, программный клей для автоматизации работы других инструментов, как сам сmd или sh.

          Можете ли вы на нём написать, например, текстовый редактор? Можете. Но зачем, если это проще и быстрее сделать на том же С#?
            –1
            Но зачем, если 99.9% решаемых фактически задач вполне решаемы на CMD?

            Простите за тавтологию.

            И, кстати можно и в планировщик «забить», и самим CMD сделать «частью плана»,,,
              +2
              Вопрос в сложности и скорости решения.
              и Cmd, и PowerShell «заточены» под исполнение внешних приложений. Но когда мне понадобилось обработать группу файлов (удалить часть файлов по списку), разобраться в работе PowerShell было проще, чем вспомнить как использовать цикл в Cmd.

              В C# можно решить те же задачи, но при этом вместо однострочного вызова вы получаете блок кода с инициализацией вызова, работой stdin/stdout (если ещё оно будет работать, многие консольные приложения без бубна не пишут вывод в реальном времени).

              Каждому инструменту своя задача.
                –3
                Для тех, кто родился в 201х — PowerShell проще, а для тех, кто родился в 80х — CMD привычнее.

                P.S. Удалить «часть файлов по списку» и в CMD делается одной строчкой, вне зависимости от верочтности включений/исключений.

                ss64.com закрывает 99,9% зависимости от хелпа.
                  +3
                  привычнее != проще.
                    0
                    Так же как и в PS. Назовём это «удалить часть файлов по списку*». Это краткое версия описания задачи. В скрипте нужно было скопировать часть файлов, за исключением некоторого списка. Часть deployment-скрипта, включающего работу с git, реестром и архивирование.

                    Я конечно могу разобраться и написать всё это для cmd, но даже установка cygwin и использование sh вместо bat — продуктивнее (да, я делал это под Win XP).
                      0
                      Ну вот и ответ :)

                      Оно возможно. PS сделал это проще чем в CMD и не так как в REXX.

                      Есть еще один маленький нюанс. Сейчас все ратуют за продуктивность. Продуктивность CMD была бы меньше, чем PS? Не думаю…

                      P.S. Самый крупный мой BAT/CMD переваливает за 200 строк.
                        0
                        Всё таки обсуждение PS vs. BAT более актуально, чем PS vs. C#
                        C# и PowerShell — взаимодополняющие инструменты для разных задач.
                        PowerShell и BAT — новый инструмент разработанный на смену старому.

                        > Есть еще один маленький нюанс. Сейчас все ратуют за продуктивность. Продуктивность CMD была бы меньше, чем PS? Не думаю…

                        Я всё таки поспорю, что будет: что в bash, что в PS мне не нужно заморачиваться, сколько же '%' всё таки мне нужно поставить, чтобы переменная корректно прочиталась/обновилась.
                        BAT выглядит как постепенные наслоения… синтаксиса, постепенно эволюционировавшие в течении многих. PS же, помимо всего прочего, взгляд на имеющийся опыт и сглаживание существующих углов.

                        Скрипт, который я упоминал (отличный образчик stackoverflow-программирования):
                        github.com/krypt-lynx/RWLayout/blob/master/Deploy/Deploy.ps1
                          0
                          Продуктивность CMD была бы меньше, чем PS? Не думаю…


                          Ну сколько например на CMD займёт такая задача как разбор XML?

                          Или например написать систему, которая будет (правильно) мигрировать виртуалки туда-сюда.

                          Или как на cmd установить обновления через Windows Update, но выборочно, не все доступные?
                    +2
                    Но зачем, если 99.9% решаемых фактически задач вполне решаемы на CMD?

                    Ну да, ну да. Попробуй в cmd хотя бы вывести на консоль, какой день недели был вчера. А про всякий WMI/CIM, PowerShell remoting, и прочее я даже и упоминать не стану.

                  +2
                  Windows — это компьютерная программа?
                    –1
                    Powershell является скриптовым языком программирования, разработанным как консольная оболочка операционной системы.
                    Понятно что на нем можно программировать. И понятно, что его специально разрабатывали для автоматизации различных процессов, для чего было сделано множество инструментов для работы с API операционки.

                    По замыслу архитекторов из MS они решили хорошие ламповые перенаправления потоков сделать как перенаправление объектов.
                    Этим они с одной стороны перекрыли путь кроссплатформенной совместимости, но убрали много ненужного парсинга.

                    Я понимаю их решение, но linux way мне нравится гораздо больше.

                    Тем не менее вопрос не в том, является или не является — конечно является.
                    И вопрос не в том, лучше он какого-нить питона или перла — это не универсальный скриптовый язык, а оболочка операционки от создателя операционки, и возможностей по оперированию windows-related вещей в нем ожидается больше, чем от универсальных языков сторонних производителей.
                    Ну а наличие большого количества инструментов для создания полноценных приложений — это плюс, и возможность выбора, а вот призывать на нем писать — не стоит.
                      0
                      перекрыли путь кроссплатформенной совместимости

                      Как именно? PowerShell же — кроссплатформенный язык
                        +1
                        но на линуксе не будет работать много вещей, заточенных под win, а их там очень много.

                        Это конечно не совсем точный пример, но представьте, что баш перенесли на винду, а gnu tools забыли. Что-то под виндой найдется свое, но…
                        +3
                        они решили хорошие ламповые перенаправления потоков сделать как перенаправление объектов.
                        Передача объектов по пайплайну — это самое лучшее что могло случится с командной строкой вне зависимости от ОС. То что раньше занимало на sh/cmd десятки строк и требовало создания промежуточных файлов для перелива данных сейчас можно просто решить одной строкой. Взял данные с лога в виде объектов, отфильтровал, отсортировал, выбрал нужные элементы отвечающие условиям и положил в нужно тебе формате и нужно кодировке — и все это одной строкой.
                          0
                          Но написать свой собственный кастомный инструмент на коленке — уже не выйдет, надо в программировании разбираться побольше.
                          Также сложно внедрить сторонние кроссплатформенные решения.

                          А в баш можно внедрять многие вещи, которые вообще не думали что их будет кто-то внедрять.
                            0
                            Также сложно внедрить сторонние кроссплатформенные решения.

                            В смысле? Если ты про PowerShell на Linux, так он там уже три года как работать может.

                                0
                                но на линуксе не будет работать много вещей, заточенных под win, а их там очень много.

                                Не могу понять. Зачем на линуксе нужны "вещи заточенные под win"? Пускай себе не работают.

                                  0
                                  Пускай себе не работают.

                                  Это мешает пользоваться повершеллом на линуксе.
                                  Например, сервер на линуксе, и куча виндовых машин через ldap
                                  хочу собрать реестр с разных машин и что-то с ним сделать
                                  а командлета для работы с реестром на линуксе нет

                                  Или какие-то проблемы с case-sensetive штуками

                                  Это простые примеры, но таких мелочей накапливается, в результате не особо хочется пользоваться инструментом, в котором в любой момент чего-то может не оказаться.
                                    0
                                    Это мешает пользоваться повершеллом на линуксе.

                                    Чем мешает? Не пользуйся под Линуксом вещами специфичными для Win. Кто-то насильно заставляет это делать, что ли?

                                      0
                                      Я так полагаю, под Linux нет возможности подключиться к удалённому реестру? Что скорее проблема отсутствия инструментария, чем проблема PowerShell в частности. В PowerShell вполне возможно добавить кастромный командлет.
                                        0

                                        Я не знаю технических деталей, как устроено подкулючение к удаленному реестру из Windows, но, подозреваю, что эта фича так же специфична для Windows, как и сам реестр. Впрочем, думаю, что через CIM это вполне возможно, т.к. это технология кроссплатформенная.

                                      0
                                      командлета для работы с реестром на линуксе нет
                                      зато есть remote session
                                0
                                Но написать свой собственный кастомный инструмент на коленке — уже не выйдет, надо в программировании разбираться побольше.

                                Строка — это частный случай объекта. Строками никто не запрещал пользоваться. Появилась новая возможность, старая не исчезла

                            +2
                            Я так и не сподобился освоить PowerShell, показалось сложным. Я не администратор, просто программист и целевая платформа у меня юниксоподобные системы, линукс, хотя и приходится работать под windows, так как политика компании такая. PowerShell конечно приятен тем, что интегрирован в систему, но с другой стороны это его и ограничивает. Хотя наверняка его можно и под linux поставить. Только кому это надо если, большинство скриптов на bash написано. Вот потому WSL зашло мне. Больше ничего и не надо. Вполне годится для автоматизации каких то своих задач.
                            0

                            Статья не о чем

                              0
                              Является или нет PowerShell языком программирования — на самом деле эта информация никакой особой полезности не несет. Важно какие задачи он может выполнять.
                              Для решения задач администрирования и интеграционного скриптинга PS вполне подходит, пайпы — очень удобный механизм, который делает код крайне компактным, также в PS много готовых полезных командлетов для управления ОС, WMI, SCCM в том числе удаленного. Есть не мало расширений, которые добавляют новые командлеты для управления системами различных вендоров (наприме VMware Veeam).
                              Основной минус PS — низкая производительность. И чем больше в коде пайпов, тем медленнее он работает ( циклы % и условия? особенно). Прискорбно, но приходится менять удобство и компактность на производительность (но есть и плюсы — код без них, вероятно, более понятный), использовать различные ухищрения типа класса ArrayList вместо обычных, хэшировать крупные массивы для быстрой обработки, прибегать к классам LINQ из C# для быстрого определения уникальных записей (хотя казалось бы есть готовые командлеты, но работают медленно) и т.д.
                              Также есть опыт использования PS для разработки небольших программ с текстовым интерфейсом — вполне себе неплохо работает, параллельные вычисления даже использовал для быстрого опроса большого числа рабочих мест, с взаимодействием с БД также особых проблем не было (не ORM конечно как на C# но таких задач и не стояло)

                                +1
                                меня сама идея передачи объектов восхитила. В отличие от убогого «все есть файл», тут «все есть объект», где кроме собственно потока данных есть еще и свойства (метаданные).
                                Конечно объекты можно сериализировать в XML, JSON или любой другой формат чтобы получить обычный поток данных. Но в PowerShell это обычно не нужно. А поскольку это часть .NET, то легко включать .NET классы прямо в скрипт и которые компилируются в DLL. Можно в WINAPI через .NET обращаться. Поэтому «скрипты» получаются весьма могучими. Правда UI не очень удобно в рукопашную делать. Обычно это типа WinForms, но и XAML (WPF) можно приделывать. В общем, самый большой скрипт у меня давно уже перевалил за 100КБ.
                                  0
                                  Самое важное отличие, от отсутствия которого страдают все доисторические шеллы — отказ от автоматической разбивки строки на список строк при раскрытии значения переменной в аргументах вызова программы.
                                  +1
                                  Очевидно, что PowerShell не является языком программирования.
                                  Смотрим Википедию: «PowerShell — расширяемое средство автоматизации от Microsoft с открытым исходным кодом[2], состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.»
                                  Вот язык сценариев PowerShell — это язык программирования.

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое