Знакомство с PowerShell

    О том, что Microsoft в недавнем прошлом разродилась свежей оболочкой под названием PowerShell, я узнал еще с год назад. А вот попробовать, что это за зверь такой, никак руки не доходили. Но вот на днях на свежеустановленном Window Server 2008 я обнаружил эту штуку в составе предустановленных компонент, и любопытство все же взяло верх. Открыл, попробовал набить пару команд типа «help», "?" и т.п. — в результате был получен список всех команд (в жаргоне PowerShella, командлетов — cmdlets), оказавшийся достаточно объемным. Причем в списке фигурировали названия вроде ForEach, Where, которые не могли не вызвать интереса к тому, как эти конструкции можно потрогать. Полез за документацией и был приятно удивлен найденным переводам книг-учебников по сабжу (читал Windows PowerShell RU) — ссылки можно найти на блоге одного из активных участников комьюнити:

    blogs.technet.com/abeshkov/archive/2008/12/24/3172943.aspx



    Итак, после нескольких часов работы с PowerShell в голове отложилось:
    — PowerShell ничем не хуже обычного cmd.exe
    — Очень понравилась концепция объектно-ориентированной обработки данных, полученных из команд (командлетов). Порадовался, что можно зайти на ветку реестра, например, HKLM, как на обычный диск, командой cd HKLM: и побродить по нему все теми же ls и cd, читая атрибуты объектов реестра способом, аналогичным тому, который используется при чтении атрибутов файлов и директорий.
    — Не очень понравился процесс ввода длинных команд и их редактирования (в случае, если они многострочные). Наверное, в этом случае нужно было действовать, загружая файлы скриптов, редактируя их отдельно от оболочки.
    — Не очень понравился синтаксис PowerShella с точки зрения личного неудобства — мне не нравится то, что нужно предварять имя любой переменной знаком $ или $_ в случае обращения к переданному объекту. Но, считаю, что к этим неудобствам вполне несложно привыкнуть, зато в коде сразу видны переменные + минимизируется число телодвижений.
    — Впечатлила возможность импорта/экспорта объектов в форматы CSV, XML (как я понял, происходит это с помощью механизма сериализации .NET), а тем более возможность взаимодействия с COM-объектами (в книге рассмотрен пример, в котором код в десяток строчек формирует раскрашенную таблицу и сохраняет её в XSLX-формате).
    — Описание возможностей интеграции CLS-совместимого .NET-кода с PowerShell оставило туманное впечатление о действительно большом достижении в области создания расширяемых механизмов администрирования. (С этим я еще не разбирался, самому интересно, насколько заявленная мощь соответствует действительности. Однако то, что можно прикрутить .NET-код, в любом случае радует).

    В общем, впечатление позитивное и мне было бы интересно узнать отзывы тех людей, которые вплотную работают с этим инструментом.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 70

      +1
      > PowerShell ничем не хуже обычного cmd.exe
      вы пропустили wmic? ;)
        0
        Спасибо за наводку. Интересная вещь.
          0
          каюсь, пропустил ) но обязательно посмотрю, спасибо.
          –10
          лучше бы bash переписали для винды
            +2
            По возможностям PowerShell не уступает Bash.
              –8
              ну так давно уже пора нормальный cli для винды написать.
                +4
                Правда, это Вы на сайте МС прочли?
                  –1
                  Тоже почему-то именно так и подумал…
                  Вообще, насколько я понял, лет через 10 в каком-нибудь очередном релизе Форточек все-таки отделят всю графическую подсистему от ядра оси. И настанет в Форточках эпоха X-Серверов.
                  Ну и так далее… Монолитное ядро… Кастомные Окружения рабочего стола… Everything is a file… До открытия исходников под GPL отсюда совсем недалеко. Кто там, говорите, победит в итоге? ^_^
                    +5
                    В виндовс сервер 2008 уже отделили гуй от ядра, на сервер можно поставить сисему без окошек
                      +1
                      Победит то, что окажется удобнее конечному потребителю. Windows-way не предполагает настройку кастомных DE пользователем, также как и раскрытие исходников под GPL.
                      И да, вы не поверите — про PowerShell я на самом деле прочел на сайте Майкрософт. А еще там же я скачал документацию и примеры в огромном количестве, посмотрите только на script Repository.
                        –2
                        Windows-way… звучит-то как.
                        Насколькоь я понял, основная аудитория PowerShell — это как раз сисадмины. Вот только ставить под какие-то задачи виндовые сервера… Ну знаете ли… У меня возникают сомнения…
                          +1
                          Когда вам надо будет поднять AD в сети из >50 компов сомнения отпадут.
                      0
                      PowerShell использует .net, а .net в свою очередь не уступает Bash
                        0
                        «Ламборгини» выпускает спортивные машины. Все это знают и это как бы синоним спорткаров. Но вот незадача, они еще выпускали тракторы и джипы (военные). И вроде в общем контексте, если человек будет говорить о «Ламборгини» как о спорткарах, он особо не ошибется. Но если же обсуждать конкретно марку, то упущение факта производства других типов машин будет грубостью.
                        Вот такая вот метафора. «Ламборгини» — шелл, джип — ПовреШелл, а „Кунташ“, например, — Баш. Да, вы правы, у тех и других есть колеса, двигатель, трансмиссия. Но вот они совсем не похожи и для разных целей используются.
                        За ПоверШеллом я слежу с начала 2006 года, он сразу привлек мое внимание, но вот незадача, он хорошо для автоматизации и разового использования, ну неудобен он мне и все. С башем я породнился в первую же минуту. И в реальных условиях баш+перл+крон для меня намного приятнее. Ну конечно, портировать Баш под вин архитектуру, как предлагают ниже, это полный маразм.
                          0
                          метафора конечно ничего так, но есть одно НО: «ну неудобен он мне и все».
                          это но перечеркивает весь смысл Вашей метафоры
                            0
                            «Я» — это обычный пользователь, которому не тепло, не холодно от возможностей ПоверШела, а от моему другу админу-розрабу, который не шарит С# это идеальное решение. Это дополнение к метафоре =)
                              0
                              а че ему влом выучить if… then… while? у баша тоже такие есть, никто ведь не заставляет учить все десятки тысяч классов.нет, базовый функционал аналогичен башу, но если захочется чего-то помощней, вместо перла или питона.нет пойдет отличненько
                                0
                                Если я не ошибаюсь then'a там нету (в ПШ и в Си-подобных языках) ибо синтаксис его не требует, не паскаль же, а if есть в command.com времен доса 6.0, посмотрите пожалуйста.
                                Ну while, это прямо долгожданный прорыв, а про foreach, — пиковое достижение виншелов, я уже молчу =) Дот НЕТ не переносим в отличии от того же Питона и Перла (который уже, давно, кстати, ООП) и сложнее (опять же, субьективно).

                                Если быть откровенным, то тут дело не в тупости программных архитекторов МС или программеров, а в самой глобальной модели ОС, — ну не смогут они отточить функционал шела до уровня никсовых за 5 лет, нереально это, у них разница в развитии более 30 лет, опять же я бы мог приводить примеры с автопромышленностью, все дается опытом и постоянным оттачивание. А если еще учесть и то, что МС достаточно вяло воспринимает пожелание пользователей, то тут картина не очень, еще долго им работать в плане удобства.
                                  0
                                  if… then… while — читай как базовые возможности
                                  ооп уже как бы не время хвастаться, непонял к чему это было
                                  .нет очень даже переносим (моно — яркий пример)

                                  а чем же функционал баша лучше функционала повер шелла? (это не ирония, я на самом деле хочу знать)
                                    0
                                    Зря вы считаете, что не время хвастаться, если почитаете зарубежные статьи посвященные ПШ, то основным преимуществом называется его ООП'шность.

                                    Ни видел не одного яркого, нет… не яркого, а реального и нужного примера такого работающего переноса, ай да… еще ж WinAPI, хотя в последнее время МС все больше рекомендует воздержатся от его непосредственного использования, приукрашивая это недолугими примерами из библиотеки дот нет, а внизу пишет примечания, что мол эти примеры для ознакомления и МС ни за что не отвечает, в случае их применения в реальном коде :)))

                                    Функциональность лучше тем, что за ним можно и приятно работать, он у меня всегда открыт и я постоянно ним пользуюсь, вот сомневаюсь, что и ЦМД, и ПШ также украшают стол вин-программера или на худой конец админа. Я за полчаса могу написать программу для работы с сетью используя стандартный набор программ (которые все изначально работают в консоли и поддерживают контейнеры), парсить их вывод скриптом на перле, и им же ними управлять. Мой друг админ под вин, потратит на это же вчетверо больше времени, половина которого уйдет на бессмысленную отладку работы сокетов…
                                    Если вы не работаете в никсе, мне бесполезно вам объяснять. Это надо просто почувствовать.
                                      0
                                      тоесть преимущество баша в «стандартный набор программ (которые все изначально работают в консоли и поддерживают контейнеры)» а вместо самого баша можно использовать все что угодно получается… зачем тогда меряться пиписьками если в итоге рулит набор утилит?
                                        0
                                        Рулит концепция, честно говоря, в детали других никс шеллов я не углублялся. Ответ на вопрос — моя метафора :)

                                        По сути, есть черное окно, куда можно вводить команды. Вопрос, какое окно лучше, практичнее и удобнее? Ответ — баш.
                    +1
                    Почему это было бы лучшим решением, на ваш взгляд?
                    Мне кажется, что концепция PowerShell выгодно отличается от basha хотя бы тем, что она — новое изобретение, а не ремикс давно известных. Кстати, имхо, на bash'e было бы сложно сделать некоторые вещи из тех, о которых написано в упомянутой книге.
                      –9
                      power shell не новое изобретение. а просто концепцию стандартного шела для никсов переврали для микрософта. то что было бы сложно для вас на баше наверняка не сложно для тех кто баш знает.
                        +4
                        В Вашем случае советую запустить PowerShell в виртуальной машине и наконец-таки его попробовать.
                          –1
                          уже давно попробывал.
                          Да это супер если учесть что раньше пародия на cli была.
                          +1
                          ну, может быть, вы и правы, с башем я не работал, но слышал отзывы.
                          однако, мне все-таки кажется, что с объектной моделью работать удобнее, нежели с текстом. во всяком случае, олдскульные методы не теряют актуальности (т.к. ToString всегда в кармане :) ).
                          –4
                          Когда это оно оказалось новым-то? О_о Хотя таки да… Для заядлых форточников это новая, революционная и инновационная технология администрировани и взпимодействия с тем, что он таки администрирует… Высший пилотаж просто. Это же надо — Windows-сервер рулить в консоли и при этом — все работает! Нет, определенно для этого нужно еще 5 сертификатов получить у Microsoft и еще пару на Brainbench и еще пару у независимых аттестаторов…
                            0
                            и откуда столько ненависти и презрения?..
                              –3
                              Да почему же ненависти-то? Все на самом деле так и есть.
                          +9
                          Почему именно bash? Мало что ли других оболочек в тех же*nix системах?
                          Может потому что вы привыкли именно к bash? Цель PowerShell не в пользовательской оболочке, удобной линуксоидам. PowerShell — это новые возможности, требующие новый синтаксис.

                          Это не просто оболочка, это среда полностью интегрированная с CLR, с которой можно работать как на уровне командной строки, так и программном, на уровне объектов .Net.

                          Все это позволяет очень упросить скриптовое администрирование, манипулируя объектами, а не строками.

                          А для использования в качестве файлового менеджера PowerShell поддерживает привычный синтаксис как из cmd, так и большинство привычных nix-комманд.
                            –7
                            Лучше бы вменяемые текстовые конфиги сделали. За это бы Microsoft спасибо сказали бы очень многие.
                            0
                            он уже давно портирован и успешно применяется
                            sourceforge.net/project/showfiles.php?group_id=2435&package_id=24963
                            +1
                            А в винде есть подобие openssh?
                              0
                              в sfu легко добавляется, как и bash/остальное, во всех nt
                                0
                                А что такое SFU?
                                Я про то, имеется ли какое-либо встроенное консольное средство управления с шифрованием.
                                  0
                                  ещё ранее interix и далее sua (subsystem for уних-based applications) тк вроде попала под всеобщий запил

                                  это надо powersshell смотреть ;)
                              +3
                              Сам пока PS толком не копал, но примеры работы с .NET (на примере SharePoint) очень впечатлили
                                +1
                                C точки зрения разработчика (не админа) — так себе.

                                Базовые фичи недоделаны (у меня в csv нет заголовков — значит надо ждать PowerShell 2 или писать парсинг с нуля).
                                Переусложнённая разница между объектами и хешами.
                                Производительность вызова .NET методов ужасна.
                                Хотел сделать импорт из файла в миллион строк — 70% времени ушло на Method.Invoke, и это при том что я указал фиксированный метод.

                                Но написать несложный one-liner, особенно использующий реестр — вот это приятно и удобно.

                                Если кратко, для тех вещей, для которых есть провайдеры (реестр, sharepoint, AD) — удобно.
                                Но шаг влево/вправо часто приводит к огромным и переусложнённым скриптам.
                                  0
                                  >(у меня в csv нет заголовков — значит надо ждать PowerShell 2 или писать парсинг с нуля

                                  Заголовки можно передать как параметр ipcsv
                                    0
                                    В какой версии PowerShell?
                                    Если я правильно понимаю, PowerShell 2.0 есть только в виде CTP, а 1.0 этого не понимает.
                                      0
                                      в 2.0 CTP 3 — вполне пригоден к использованию. Что в 1.0 — не знаю
                                        +1
                                        Верю.
                                        Но насколько я помню PowerShell не поддерживает две инсталляции одновременно (1.0 и 2.0), а у меня не было желания на сервере заказчика заменять стабильную версию чего-либо на CTP, если в этом не было жизненной необходимости.

                                        Вот если бы import-csv умел работать построчно (выдавая массив или что-нибудь там) — проблемы бы с самого начала не было.
                                    0
                                    Если кратко, для тех вещей, для которых есть провайдеры (реестр, sharepoint, AD) — удобно.
                                    Но шаг влево/вправо часто приводит к огромным и переусложнённым скриптам.


                                    Хотелось бы пример и сравнительный код на баше
                                      +1
                                      Я не пишу на баше, потому что я
                                      a. не админю линукс
                                      б. знаю перл

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

                                      Пример сложного скрипта так сходу не приведу, ну пример шага влево с тем же csv (не мой):
                                      get-content file.csv|select-object @{e={$_.split(',')[0]};n='Country'},@{e={$_.split(',')[1]};n='Points'}
                                      это если не нужны хедеры, и это ведь ещё неправильный код — он подавится на заэскейпленых символах.

                                      Скрипт импорта (из-за производительности) я в итоге написал на boo (http://boo.codehaus.org/) и не жалею.
                                        0
                                        Каким образом на boo вы обошли отсутствия корретного парсинга CSV?
                                          0
                                          Положил рядом вот эту библитеку (http://www.codeproject.com/KB/database/CsvReader.aspx).
                                          Сделал import LumenWorks.Framework.IO.Csv from 'LumenWorks.Framework.IO' (если не путаю по памяти).

                                          Дальше просто. Кстати и импорт таким образом гораздо проще чем стандартное LoadAssembly в PS.
                                            0
                                            Ну в принципе, я думаю, на PSh было бы ее использовать немногим сложнее
                                          0
                                          Кстати можно упростить:

                                          Вынести повторяющийся split отдельно
                                          gc file.csv | %{ $_.split(',') } | select @{e={$_.[0]};n='Country'},@{e={$_.[1]};n='Points'}
                                          


                                          Ужасные хешы можно поробовать сконвертировать в объекты по другому:
                                          powershell.com/cs/blogs/tips/archive/2008/11/14/converting-hash-tables-to-objects.aspx
                                          0
                                          Другой пример шага влево — out-excel. Пример функции, который можно найти в инете, не работает с определённым сочетанием региональных настроек Экселя (уже забыл в чём там конкретно дело). Теоретически это лечится выставлением культуры, но выставление культуры стандартным образом через currentthread не работает в powershell, по неизвестным причинам.
                                            0
                                            Ага — поискал и нашел массу уродских воркераундов типа вызов через рефлешн всех методов — сам не сталкивался
                                        +2
                                        — PowerShell ничем не хуже обычного cmd.exe

                                        Тормознее, больше жрет памяти, меньше инсталляционная база — за удобствор надо платить

                                        — Не очень понравился процесс ввода длинных команд и их редактирования (в случае, если они многострочные)о

                                        в ISE вроде нормально — перехотд на следующую строчку Shift + Enter. Если хочется большего — набрать в верхнем окне редактора ISE и запустить.
                                        +1
                                        — мне не нравится то, что нужно предварять имя любой переменной знаком $ или $_ в случае обращения к переданному объекту. Но, считаю, что к этим неудобствам вполне несложно привыкнуть, зато в коде сразу видны переменные + минимизируется число телодвижений.

                                        Как бы вы отличали переменные от строчек, если бы они не отделялись символом $. В cmd было аж два знака %name%

                                        Что бы значило gc test — получить содерджимое файла test или получить содержимое файла с именем лежащим в переменной test?
                                          +5
                                          Я не совсем понимаю, чем это лучше, к примеру, питона?
                                            +2
                                            Как минимум, это удобно для тех, кто знаком со средой .NET — привычные инструменты из команд-лайновой оболочки.
                                              +1
                                              z1. тем чем шелл лучше языка программирования — предназначен для работы с файлами и решения сиюминутных задач. Попробуйте на питон перевести

                                              ls c:\windows -rec -fil *.dll | ?{ $_.IsReadOnly }
                                              


                                              вывести все файлы с атрибутом 'read only' из c:\windows и подпапок

                                              или

                                              gsv *sql* | ft -group status
                                              


                                              Вывести в табличку все вервисы в название которых входит SQL и скгруппировать по статусу

                                              2. Тем, что поддерживается MS в своих продуктах — напр Exchange, SQL server
                                              +2
                                              Прелесть PS в том, что он работает с объектами — .NET, COM. Соотвественно с этими объектами можно вытворять все что угодно. Вся функциональность .NET-framework'а у вас в консоле и скриптах.

                                              Давно надо было заменить cmd на PS, еще с момента появления .NET.
                                                +1
                                                сам три дня назад начал учить power shell. могу порекоммендовать ресурс windowspowershell.ru и локализированную документацию www.microsoft.com/downloads/details.aspx?FamilyID=B4720B00-9A66-430F-BD56-EC48BFCA154F&displaylang=en (переведены userGuide и gettingStarted)
                                                  +2
                                                  Ну это смешно. В с 95 года по 2003 на весь Божий свет громогласно заявлялось, что CLI — дела давно минувших дней, страсть юниксовых зубров и прочих отморозков. Теперь же вдруг оказалось, что вот, мол, есть необыкновенная, новая, божественная технология скриптования…

                                                  Вот почему-то кажется, что всякие там *sh переживут powershell.
                                                    0
                                                    Для обычных пользователей (не сисадминов и не разработчиков) GUI действительно предпочтительнее CLI в подавляющем большинстве случаев. Поэтому, в такого рода заявлениях нет ничего удивительного. Все равно бухгалтерам в сто раз удобнее работать с помощью несложных тыкательных интерфейсов, нежели соображать, какую команду ввести в консоль. А для специализированных задач CLI необходим как намного более гибкий (а вместе с тем, и сложный) инструмент. И, мне кажется, что здесь нет никакого противоречия.
                                                      0
                                                      противоречие заключается в том, что Microsoft занимается не только домашними и офисными системами, не так ли? В серии NT тоже ведь продвигалась новая парадигма управления компьютером, и тоже не было приличного родного CLI-интерфейса. Ин-ту-и-тив-на-я, как соска для младенцев.
                                                        0
                                                        Несложные операции администрирования тоже неплохо заворачиваются в концепцию графического интерфейса.
                                                          0
                                                          Ну да. Несложные операции администрирования даже лучше и лакончиней заворачиваются в простые команды :)
                                                            0
                                                            у команд плохо с эксплорабилити
                                                              0
                                                              :) Действительно, нужно доки читать :)

                                                              Каждая классическая команда или программка в *никсах — это простой кирпичик. ПРи помощи простых же средств из них можно волшебные штучки делать, для которых в интерфейсном смысле придется та-а-а-а-а-акого нагородить…

                                                              Вы видели «интуитивный» интерфейс современных программ-монстров? Автокад из чертилок; Гудини, Блендер, Макс из рисовалок; Студия и Эклипс из программировальных; Офис из офисов. Хренушки вам интуитивность; там ж десятки кнопочек, графиков, менюшек, подменюшек… И все это еще загрузить надобно. :)
                                                      0
                                                      1. А они увидели, что юниксоиды внедряют гуй и решили отомстить
                                                      2. PSh не для конечных пользователей а для виндовс-отморозков
                                                      0
                                                      А как же автодополнение команд? Я такой возможности в powershell не увидел…

                                                    Only users with full accounts can post comments. Log in, please.