Jump Start в PowerShell (часть I)

Только автоматизация. Только PowerShell.



Предисловие


В качестве хобби и при наличии времени преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий). На данный момент у меня мало времени, чтобы уделить его группе студентов, зато вполне достаточно, чтобы подготовить пост здесь, на Хабре.

Я работаю системным администратором в крупной не ИТ-компании с большой завязкой на ИТ ресурсы. По роду деятельности представляется решать большое количество однотипных задач по обслуживанию пользователей.

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

Внимание: PowerShell вызывает привыкание.

Введение


Википедия говорит нам:
Windows PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.

Выглядеть среда PowerShell может так, как командная строка:


powershell.exe

Или в виде приложения:


powershell_ise.exe

Powershell_ise.exe называется интегрированной средой сценариев — Windows PowerShell ISE. Позволяет работать с языком в удобной среде с подсветкой синтаксиса, конструктором команд, автозаполнением команд по нажатию TAB и прочими прелестями. Идеальна для создания и тестирования сценариев.

Для запуска среды powershell.exe или powershell_ise.exe достаточно набрать аналогичное название в строке выполнить.



Файл сценария PowerShell имеет расширение .ps1.



Сценарий не получится запустить двойным ЛКМ. Это сделано специально для того, чтобы не нанести вред системе случайно запущенным скриптом.

Для запуска, по клику ПКМ следует выбрать «Выполнить с помощью PowerShell»:



Помимо того, что существует ограничение по запуску сценариев ЛКМ, по умолчанию выполнение сценариев в системе запрещено, опять же, по описанной выше причине — не нанести вред системе. Для проверки текущей политики выполнения выполним команду:

Get-ExecutionPolicy




Мы получим одно из следующих ниже значений. С большой вероятностью, если это был первый запуск, мы получим Restricted.

  • Restricted — Сценарии не могут быть запущены;
  • AllSigned — Могут быть запущены только сценарии, подписанные доверенным издателем. Перед выполнением сценария доверенного издателя будет запрашиваться подтверждение;
  • RemoteSigned — Разрешено выполнять созданные нами сценарии и скачанные сценарии, подписанные доверенным издателем;
  • Unrestricted — Никаких ограничений, все скрипты могут быть запущены.


Для выполнения и тестирования понизим политику до RemoteSigned выполнив команду:

Set-ExecutionPolicy RemoteSigned




Приступаем к работе


Командлет

  • Командлетами называются команды PowerShell, в которых заложена различная функциональность;
  • Командлеты могут быть как системными, так и пользовательскими, созданные кем-либо;
  • Командлеты именуются по правилу Глагол-Существительное, что упрощает их запоминание;
  • Командлеты выводят результаты в виде объектов или их коллекций;
  • Командлеты могут как получать данные для обработки, так и передавать данные по конвейеру (про конвейеры позже);
  • Командлеты не чувствительны к регистру (можно написать и get-process, и Get-Process, и GeT-pRoCeSs);
  • После командлетов не обязательно ставить ";", за исключением, когда мы выполняем несколько командлетов в одну строку (Get-Process; Get-Services).


Например, для получения текущих процессов, мы выполним команду:

Get-Process 


И получим результат:



Попробуйте самостоятельно выполнить:

Get-Service #для получения статуса служб, запущенных на компьютерах


Get-Content C:\Windows\System32\drivers\etc\hosts #для получения содержимого файла. В данном случае, файл hosts


Не обязательно знать наизусть все командлеты. Get-Help спасёт ситуацию.
Информацию о всех доступных командлетах можно получить, введя следующую команду:

Get-Help -Category cmdlet


Если мы используем PowerShell ISE, мы облегчаем процесс разработки.
Достаточно ввести знак тире "-" после того, как ввели командлет, и мы получим все возможные варианты параметров и их типы:



Попробуйте выполнить:

Get-Service -Name p*


Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member:

Get-Process | Get-Member

#Знак "|" называется конвейером. О нём ниже.




Недостаточно информации? Обратимся к справке с параметром -Examples:

Get-Help Get-Process -Examples


Получаем описание Get-Process, да ещё и с примерами использования:



  • Командлеты могут иметь сокращённые названия — алиасы. Например, вместо Get-Help можно использовать просто Help. Для получения всех сокращений выполните Get-Alias.


Попробуйте выполнить:

Start-Process notepad


Что аналогично записи:

start notepad


А теперь остановим процесс:

Stop-Process -Name notepad


Или так:

spps -Name notepad


Немногим ранее мы сказали, что командлеты именуются по правилу Глагол-Существительное. Уточню, что глагол не обязательно должен быть Get. Помимо того, что мы можем получать, мы можем задавать Set (помните, Set-ExecutionPolicy), запускать Start, останавливать Stop, выводить Out, создавать New и многие другие. Название командлета ни чем не ограничивается и, когда мы будем с вами создавать свой собственный, сможем назвать его так, как душе угодно.

Попробуем выполнить вывод в файл:

"Hello, Habr!" | Out-File C:\test.txt
& C:\test.txt


Кстати, аналогично можно записать так:

"Hello, Habr!" > C:\test.txt
& C:\test.txt


Комментарии

Мы все знаем, использовать комментарии является хорошим тоном.

Комментарии в PowerShell бывают строчные — # и блочные — <##>:



Обратим внимание, на код из примера:

Get-WmiObject -Class Win32_OperatingSystem | SELECT Caption


Для тех, кто знаком с WMI, кто делает это на старом добром VBScript, помните, сколько кода надо написать?

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
For Each objItem in colItems
    Wscript.Echo "Caption: " & objItem.Caption
Next


Конвейер

Конвейер (|) — передаёт выходные данные одной команды во входные данные на обработку другой команде. Мы использовали конвейер ранее, получая все свойства объекта или, в предыдущем примере, выбирая из набора данных только поле Caption.

Чтобы понять принцип конвейера, давайте выполним код:

Get-Service | Sort-Object -property Status


Что произойдёт: получаем все службы (Get-Service), передаём все полученные службы на сортировку в командлет Sort-Object и указываем, что хотим отсортировать их по параметру Status. На выводе мы получим сначала все службы со статусом Stop, а потом все службы со статусом Running.

В примере ниже мы сначала получим все запущенные службы. После первого конвейера проходимся по каждому элементу, выбираем только те службы, у которых статус Running и на втором конвейере выбираем, что хотим на выводе увидеть только displayname служб:

Get-Service | WHERE {$_.status -eq "Running"} | SELECT displayname


В примере мы используем $_. Данная запись означает текущий элемент в конвейере.



Послесловие


В этой части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Если мы что-то забудем, обязательно Get-Help.

Все это знания нужные для того, чтобы сделать первый прыжок в язык. Поверьте, ещё много интересного!

Продолжение следует...



Дополнительная информация



Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 63
  • +2
    У кого с английским хорошо — рекомендую: powershell.com/cs/blogs/ebookv2/default.aspx
    • +2
      Мне понравилась ваша статья, для новичков в самый раз. Не доводилось работать с powershell, все больше слышал, но не трогал.

      Теперь заинтересовался.
      • –1
        > С языком PowerShell познакомился около двух лет назад, но вплотную занялся им лишь спустя год, не осознав поначалу его огромных возможностей.

        После этой статьи у меня ровно такое же впечатление. Ладно, выводим список процессов и служб… быстрее же Ctrl+Shift+Esc. Ну комментарии есть и вывод в файл.

        Я ожидал, скажем, «вау» — эффект. Типа «вот вы не знали, что задача XXX, которая постоянно всплывает, может быть решена на PowerShell в две строки, а вон оно как просто решается %пример кода%». Код может быть непонятным, тут задача только привлечь внимание. Моё внимание вы не привлекли, я по-прежнему думаю, что PowerShell — это неведомое непонятное ненужное нечто.

        После привлечения внимания, статья как вводная была бы в самый раз, тут всё хорошо.
        • +3
          Вот с таких вводных знаний и начинается решение повседневных задач в 2 строки повершела. Это лучше чем бездумно копировать чужие скрипты, не понимая, что они делают.
          • +1
            А когда узнаёшь, что с помощью такой консольки можно управлять не только своим пк, а и огромными комплексами серверов и сервисов и рабочих станций на сотни и тысячи, вроде MS SQL, SharePoint, Lync, Exchange, сервисами Azure и дальше — больше…
            А ещё можно WinForms и WPF, да и веб интерфейсы делать, потому как PowerShell в общем-то такой же .Net язык, со всей мощью данной платформы.
            • 0
              > Вот с таких вводных знаний и начинается решение повседневных задач в 2 строки повершела.

              Ну да, я же и написал «статья как вводная была бы в самый раз, тут всё хорошо»

              > Это лучше чем бездумно копировать чужие скрипты, не понимая, что они делают.

              Я не про копирование скриптов, если вы не поняли. Я про то, что необходимо было привести пример «огромных возможностей». То есть, решения какой-либо повседневной задачи. Вывод списка процессов и служб — это не огромные возможности.
            • 0
              >> Ладно, выводим список процессов и служб… быстрее же Ctrl+Shift+Esc
              А содержимое текстового файла посмотреть два раза щелкнув по нему. Не об этом же статья.
              • 0
                Я, видимо, очень непонятно написал свой комментарий.

                Да, статья об инструменте, который даёт «огромные возможности» без какого-либо примера этих огромных возможностей, которые были бы полезны в ежедневной работе.
              • +5
                Ладно, выводим список процессов и служб… быстрее же Ctrl+Shift+Esc.

                И там роемся глазами (поиска, то нет).

                А теперь выведем все службы, относящиеся к SQL серверу:

                gsv *sql*
                


                И сгруппируем по статусу
                gsv *sql* | sort status | ft -GroupBy Status
                


                • 0
                  Да, это уже что-то уникальное. Однако, вопрос: для каких практических (!) целей можно использовать этот запрос? Я смогу манипулировать службами или переходить к процессам?
                  • +1
                    Да. Например, мне влом кажтый раз искать службу и я запускаю и остававливаю ее по имени:

                    spsv sqlserver
                    

                    Что такое в данном случае «переходить к процессам»?
                    • 0
                      То есть, список я получаю для того, чтобы потом вручную вбивать названия в команду? Тогда это близко по функционалу к командной строке и sc [имя_сервера] start имя_службы [аргументы_службы]

                      > Что такое в данном случае «переходить к процессам»?

                      Есть просто службы, есть службы, связанные с процессами, причём у одного процесса, если не ошибаюсь, может быть несколько служб. Перейти к процессу — найти процесс, связанный с данной службой (если он есть). В том же диспетчере задач из процесса можно «Перейти к службам», а у службы «Перейти к процессу». Бывает полезно при разборе десятка процессов svchost.exe, например.
                      • +1
                        «То есть, список я получаю для того, чтобы потом вручную вбивать названия в команду? Тогда это близко по функционалу к командной строке и sc [имя_сервера] start имя_службы [аргументы_службы]»

                        Ну это и есть командная строка. Только объектная — то есть сгруппировать по статусу вы можете даже если статус изначально не выводится командой gsv и не надо никак описывать формат возврата.

                        Можно еще результат подать в графический грид и что-то сделать с результатом выбора (параметр -OutputMode у ogv)

                        Процессы можно получить из WMI (см monadblog.blogspot.ie/2006/06/getting-services-associated-with.html)

                        • 0
                          Ну это и есть командная строка. Только объектная — то есть сгруппировать по статусу вы можете даже если статус изначально не выводится командой gsv и не надо никак описывать формат возврата.
                          В принципе, я так всегда и думал, но меня сбил комментарий:
                          А ещё можно WinForms и WPF, да и веб интерфейсы делать, потому как PowerShell в общем-то такой же .Net язык, со всей мощью данной платформы.
                          То есть, он компилируемый?
                          • 0
                            Нет, тут преувеличение что «такой же» — тут в том смысле, что он может использовать большинство возможностей .NET
              • 0
                Тут нужно упомянуть что пош жутко, адово медленный. Это плата за простоту и универсальность.

                Сам считаю пош очень удобным за счет конвейерности. Это его главный козырь и главный тормоз. Практически любую задачу на пош можно сделать one-liner`ом
                • 0
                  Сам считаю пош очень удобным за счет конвейерности.
                  Меня не покидает ощущение, что и эту фичу Майкрософт «спионерил» у другого известного семейства операционных систем.
              • +5
                Сразу после Get-Service | WHERE {$_.status -eq «Running»} | SELECT displayname напрашивается пример с Get-Service | Out-GridView

                Этот простой командлет просто поражает :)
                • 0
                  Это строку можно заменить на следующую:
                  gsv |? status -eq «Running» | select displayname
                  • 0
                    gsv |? status -eq Running | select displayname
                    
                    • 0
                      Даже
                      gsv | ? status -eq running | % displayname
                      
                • 0
                  Пропаганда PowerShell — good :)
                  Единственное позволю дать Вам небольшой совет: если пишите команды «на показ», пожалуйста используйте полные называния cmdlet`ов (Select-Object вместо SELECT). Так будет легче понимать код людям, которые только начинают знакомство :)
                  • 0
                    А еще в Select-object можно выводить собираемые поля:
                    gsv | Select-Object Status, @{name=«Name-DisplayName»; e={"{0} | {1}" -f $_.Name, $_.DisplayName}}

                    Здесь я, для примера, создал новое поле Name-DisplayName, в которое записал соответствующие значения. Заодно показал простую форматированную строку: "{0} {1}..." -f $var0,$var1
                    • 0
                      >Так будет легче понимать код людям, которые только начинают знакомство :)

                      … и будет легче понимать свой же код спустя энное время…
                      • 0
                        совершенно не согласласен. Общепринятые сокращения читать удобнее чем не сокращения. Поробуйте, например, заменить все знаки операций на слова в математическом выражении.

                        То же самое и в случае шелла:

                        gsv | ?status -eq running | select displayname
                        


                        Для опытного человека читабельнее чем
                        Get-Service | Where-Object {$_.status -eq running } | select-object displayname
                        


                        Просто потому, что символ? распознается глазом сразу, и не надо вчитываться select-object там или Select-String

                        • 0
                          Сисадмины (основные пользователи PoSH) очень редко хорошо знают программирование и использовонию перлоподобного синтаксиса вряд ли будут рады.
                          • 0
                            В чем синтаксис более перлоподобный чем башевский?
                            • 0
                              Башевский тоже плохой.
                              • 0
                                Какой шелл хороший?
                                • 0
                                  Я в шелле почти не работают, а из скриптовых языков нравится Python.
                          • 0
                            /хмуро/
                            Не надо рассчитывать на опытного. Надо писать как можно ближе к тому что в документации, чтобы потом скрипт можно было передать новичку и сказать «возьми доку с гуглом и посмотри по командам — разберешься».

                            зы при этом новичка, как полагается по заветам классиков — считать склонным к буйному маникальному психозу и знающим место твоего проживания.
                            • 0
                              Я отвечал на это "… и будет легче понимать свой же код спустя энное время… ".

                              Гугель не нужен — есть же powershell:

                              Скрытый текст
                              PS C:\WINDOWS\system32> % -?

                              NAME
                              ForEach-Object

                              SYNOPSIS
                              Performs an operation against each item in a collection of input objects.


                              SYNTAX
                              ForEach-Object [-Process] <ScriptBlock[]> [-Begin ] [-End ] [-InputObject ] [-RemainingScripts <ScriptBlock[]>] [-Confirm]
                              [-WhatIf] []

                              ForEach-Object [-MemberName] [-ArgumentList <Object[]>] [-InputObject ] [-Confirm] [-WhatIf] []


                              DESCRIPTION
                              The ForEach-Object cmdlet performs an operation on each item in a collection of input objects. The input objects can be piped to the cmdlet or specified by
                              using the InputObject parameter.

                              Beginning in Windows PowerShell 3.0, there are two different ways to construct a ForEach-Object command.

                              Script block. You can use a script block to specify the operation. Within the script block, use the $_ variable to represent the current object. The script
                              block is the value of the Process parameter. The script block can contain any Windows PowerShell script.

                              For example, the following command gets the value of the ProcessName property of each process on the computer.

                              Get-Process | ForEach-Object {$_.ProcessName}

                              Operation statement. You can also write a operation statement, which is much more like natural language. You can use the operation statement to specify a
                              property value or call a method. Operation statements were introduced in Windows PowerShell 3.0.

                              For example, the following command also gets the value of the ProcessName property of each process on the computer.

                              Get-Process | ForEach-Object ProcessName

                              When using the script block format, in addition to using the script block that describes the operations that are performed on each input object, you can
                              provide two additional script blocks. The Begin script block, which is the value of the Begin parameter, runs before the first input object is processed. The
                              End script block, which is the value of the End parameter, runs after the last input object is processed.


                              RELATED LINKS
                              Online Version: go.microsoft.com/fwlink/p/?linkid=289582

                              REMARKS
                              To see the examples, type: «get-help ForEach-Object -examples».
                              For more information, type: «get-help ForEach-Object -detailed».
                              For technical information, type: «get-help ForEach-Object -full».
                              For online help, type: «get-help ForEach-Object -online»

                              • 0
                                >Я отвечал на это "… и будет легче понимать свой же код спустя энное время… ".

                                И в этом случае тоже. За год-другой-третий может случиться разное, смениться профиль деятельности, например подзабыться то с чем работал раньше, и тогда будешь ругать сам себя за удобные, остроумные, но несовпадающие с докой и гуглем сокращения.
                                • 0
                                  но несовпадающие с докой и гуглем сокращения.


                                  Какое именно из приведенных сокращений не совпадает с докой или гуглём?
                            • 0
                              Я вообще использую такие конструкции
                              Get-Service |? {$_.status -eq running } | select displayname

                              {} — это вообще маст-хев, а то потом не отловишь багов или еще-чего-там вылезет, если заводить сложную конструкцию. В остальном согласен.
                              • 0
                                ? status -eq running это никакая не конструкция. Это вызов? (Where-Object) с параметрами status, -eq и running.

                                Наберите help Where-Object -detailed
                                • 0
                                  В вашем случае running нужно взять в кавычки… Иначе «непредвиденная лексема» вылазит)

                                  Get-Service |? {$_.status -eq «running»} | select displayname
                          • 0
                            Данный сабж, как и почему-то многие продукты от майкрософта, вызывает, скажем так, удивление в некоторых мелочах. Сейчас уж всего не упомню, но вот даже из скриншотов в этом топике что бросается в глаза:
                            Скрытый текст
                            image
                            Вот нафига делать такие большие расстояния между строчками и абзацами?

                            Или вот например какое огромное расстояние от конца одной команды до начала новой:
                            Скрытый текст

                            И эта не единственная встреченная мною мелочь.
                            Скрытый текст
                            Создаётся впечатление, что майкрософтовцы, пытаясь дать виндовым сисадминам инструмент «почти как у их никсовых коллег», при решительно отвергли уже готовые идеи и наработки и и сделали всё с нуля, по-своему. NIH во все поля.

                            Или у меня эффект утёнка после никсов?
                            • 0
                              • +2
                                Не сочтите за троллинг, но у товарища наверху, хелп был скачен с помощью команды Update-Help, а у вас нет.
                                Поэтому у него много текста, а у вас нет.
                              • 0
                                эффект утенка после никсов
                                • 0
                                  Создаётся впечатление, что майкрософтовцы, пытаясь дать виндовым сисадминам инструмент «почти как у их никсовых коллег», при решительно отвергли уже готовые идеи и наработки и и сделали всё с нуля, по-своему. NIH во все поля.

                                  Или у меня эффект утёнка после никсов?


                                  Как из этих мелочей это следует? Я так понял, хотели сделать объектныш шелл, интегрированный с их продуктами.

                                  Какие-то мелочи как всегда не доработали.
                                • 0
                                  Вроде и всё не плохо, но ощущение того, что майкрософт родила франкенштейна не уходит.
                                  Лично у меня PS не вызывает никаких положительных чувств, особенно, учитывая, что его сейчас пихают везде, где только можно.
                                  • 0
                                    Агрументы будут?
                                    • +1
                                      Я же специально отметил — «ощущение» и «лично у меня».
                                      • 0
                                        То есть никакой рефлексии относительно того, почему они возникли нет, даже приблизительно?
                                        • +2
                                          Мои пять копеек.
                                          PS хорош только в том, что он заменил абсолютно убогий cmd, которому, как вы помните, уже много лет. И это наверное первый шаг к полной автоматизации — что есть хорошо.
                                          Но у PS достаточно проблем со скоростью (как всегда у Майкрософт).
                                          И как пример:
                                          Скрипт открывающий файл csv (заполненный корректно для разбора с 1500 строк и 6-ю столбцами), парсит файл, ищет e-mail сотрудников и составляет письмо из полей файла csv, после чего рассылает составленные письма.
                                          Может работать 40 минут, а может 15 минут.

                                          Похожий скрипт написаный в шеле (Bash/Perl) работает всегда от 2 до 3 минут.

                                          Да, оба сервера виртуальные и находятся в равных условиях.

                                          Больше претензий у меня к PS нет :)
                                        • 0
                                          Как уже написал коллега выше — и на безрыбье рыба — рак.
                                          CMD — это явно не то, что нужно для современного управления, но и PS я (лично, опять таки) не могу называть адекватной аналогом unix shell, т.к. конкретно мне кажутся получающиеся синтаксические конструкции ужасными на вид. Бегло понять, что они делают трудно, команды длинные (в общем случае).
                                          Опять же замечу — сие мое ИМХО.
                                          • 0
                                            может это дело привычки? Можете проанализировать — что именно трудно?
                                  • +2
                                    Подтверждаю, PS действительно вызывает привыкание.

                                    Особенно жесть, если у какого-либо серверного приложения существует открытый .NET API.
                                    Кроме того, PowerShell можно использовать не только для администрирования, но и для быстрого прототипирования клиент-серверных приложений — когда надо мало кода, но нужно проверить возможности API. Либо показать их кому-то, например, при проведении обучения.
                                    Исповедь алкоголика
                                    Начал я когда-то под Autodesk Vault — у для настроек и работы изначально есть только GUI — разбирать что же реально можно сделать с API, но при этом не производя много кода. Это было бы очень удобно для демонстрации возможностей API, например, для начинающих программистов. Так получился Vault PowerPack для PowerGUI.

                                    Дальше все было как в тумане:
                                    • ZippyConsole, которая является серверной консолью Vault в командной строке — изначально для Vault доступен только GUI, что при работе, что при администрировании. Только бэкапы и ещё пару возможностей ограниченно можно реализовывать при помощи командной строки.
                                    • Поваренная книга программиста Vault(ru), Vault Cookbook(en) — в ней изначально на примере скриптов PowerShell, а затем уже на основе модуля ZippyConsole показываются best practices и возможности Vault API.


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

                                    Дальше было ещё хуже: я создал монстра. Autodesk Inventor также имеет свой API, однако он не предоставляет доступ к библиотеке компонентов. Но подгрузив определенные DLL, можно через COM получить доступ к библиотеке. Статья тут.
                                    • 0
                                      Пост замечательный. Чувствуется рука преподавателя. Обязательно продолжайте.

                                      От себя добавлю, PS использую для автоматизация большинства задач по работе с Azure. Все проблемные мелочи, описанные выше, никак не перекроют всех плюсов.
                                      • 0
                                        На MVA есть нормальный джампстарт, не тратьте на это время ;)
                                        • +1
                                          Из видеокурсов лучше сразу смотреть Ultimate Training от Дона Джонса. При хорошее мотивации можно уложиться в бесплатную неделю. :-)
                                          Курс на MVA не смотрел, но Джейсон Хелмик и формат диалога не предвещают ничего хорошего.
                                          • 0
                                            Как-то раз с неделю ковырялся с PowerShell. Остался разочарованным. а) нет бинарных пайплайнов, любой ввод понимается как текст с сопутствующим этому порчением данных. б) имел головняк с кодировками, сейчас уже плохо помню какой. в) поначалу сбивало с толку слово Shell в названии, воспринимал это именно как шелл, и надеялся на похожесть на другие шеллы и интуитивность. Зря надеялся. Это язык пограммирования, странноватый. С кучей своих заморочек, которых в других шеллах не найдешь. г) пришлось ее устанавливать в 8ю винду, или обновлять, что-то такое… вроде винда не старая, а PowerShell там староватый. Короче, это не то решение, которое будет просто работать где-то у клиента без дополнительных телодвежений.
                                            Задача была сформировать кучу параметров для проги и ее с ними запустить. Так и не порешал все проблемы, оставил это дело.
                                            • 0
                                              Вот еще что вспомнил: взять прогу с интерактиным вводом-выводом команд и просто вызвать не получится, придется этот цикл «прочитать ввод — передать — прочитать ответ — вывести в консоль» организовывать самому в скрипте. Что привычно для ЯП, но не для шеллов, шеллы такое берут на себя.
                                              • +1
                                                Да ну? Что правда никакого интерактива ???
                                                mikepfeiffer.net/2010/05/manage-exchange-2010-thumbnail-photos-with-a-powershell-based-gui/
                                                Скрытый текст
                                                image
                                                • 0
                                                  я хоть слово про гуй писал? я писал про repl, интерактивную консоль.
                                                  • 0
                                                    — я утрировал, конечно. Но интерактивная консоль тоже легко пишется. :-) Только зачем?
                                                    • 0
                                                      как так «зачем»? мне это было надо, чтоб работу мою сделать.
                                                      и я не писал, что этого сделать нельзя. можно, но это полторы страницы кода, против 1 строки в других шеллах. что еще раз подтверждает мой тезис о том, что павершелл скорее не шелл, а яп.
                                                      но основной затык, конечно, был не в этом, а в бинарных пайплайнах. они тоже легко пишутся? или они тоже не нужны?
                                            • 0
                                              Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member

                                              Строго говоря, Get-Member выводит не свойства командлета, а свойства объектов коллекции, которые выдаёт этот командлет.
                                              • 0
                                                Некропостить наше всё!)
                                                > преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий)
                                                На самом деле — я был несколько удивлен, обнаружив на хабре господ из МГКИТа. Я там учился =).
                                                А сюда принесло, ибо нужен доп-материал к моей дипломной работе(чья центральная фигура — именно Powershell-скрипт), а свои слова уже закончились.
                                                И да, спасибо за статью! (апнуть рейтинг не могу, видимо из-за даты публикации. Ну либо от нулевой кармы)

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