Pull to refresh

Comments 63

UFO just landed and posted this here
Мне понравилась ваша статья, для новичков в самый раз. Не доводилось работать с powershell, все больше слышал, но не трогал.

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

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

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

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

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

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

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

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

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

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

gsv *sql*


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


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

spsv sqlserver

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

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

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

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

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

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

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

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

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

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

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

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

gsv | ?status -eq running | select displayname


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


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

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

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

Гугель не нужен — есть же 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»

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

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


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

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

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

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

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

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

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

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


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

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

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

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

Больше претензий у меня к PS нет :)
Как уже написал коллега выше — и на безрыбье рыба — рак.
CMD — это явно не то, что нужно для современного управления, но и PS я (лично, опять таки) не могу называть адекватной аналогом unix shell, т.к. конкретно мне кажутся получающиеся синтаксические конструкции ужасными на вид. Бегло понять, что они делают трудно, команды длинные (в общем случае).
Опять же замечу — сие мое ИМХО.
может это дело привычки? Можете проанализировать — что именно трудно?
Подтверждаю, 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 получить доступ к библиотеке. Статья тут.
Пост замечательный. Чувствуется рука преподавателя. Обязательно продолжайте.

От себя добавлю, PS использую для автоматизация большинства задач по работе с Azure. Все проблемные мелочи, описанные выше, никак не перекроют всех плюсов.
На MVA есть нормальный джампстарт, не тратьте на это время ;)
Из видеокурсов лучше сразу смотреть Ultimate Training от Дона Джонса. При хорошее мотивации можно уложиться в бесплатную неделю. :-)
Курс на MVA не смотрел, но Джейсон Хелмик и формат диалога не предвещают ничего хорошего.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
— я утрировал, конечно. Но интерактивная консоль тоже легко пишется. :-) Только зачем?
UFO just landed and posted this here
Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member

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

Articles