sonyps4.ru

Powershell: как работать с программой, создавать, запускать и изменять скрипты. Введение в оболочку командной строки Windows PowerShell

29.10.2012 Дон Джоунз

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

Дон Джоунз ([email protected]) - технический инструктор по PowerShell (www.windowsitpro.com/go/DonJonesPowerShell), имеет звание Microsoft MVP

PowerShell - оболочка командной строки.

Команды PowerShell выполняются в конвейере.

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

Освоив PowerShell, вы станете более квалифицированным администратором.

Почему PowerShell?

Первым делом стоит развеять два важных мифа, касающиеся PowerShell. Миф первый: PowerShell - это язык сценариев. Неправда. PowerShell действительно содержит язык сценариев; это очень компактный язык, в состав которого входит всего лишь порядка двух десятков ключевых слов. Но на самом деле PowerShell - это оболочка командной строки, во многом сходная с cmd.exe или с оболочкой UNIX Bash. В этой оболочке выполняются команды - такие, как Ipconfig, Ping и другие команды, каковыми вы, несомненно, пользовались. Вполне возможно, на каком-то этапе у вас возникнет желание объединить несколько команд в пакетный файл, и вы имеете полное право назвать такой файл сценарием. Но составление подобных файлов нельзя считать программированием в том смысле, в котором программированием именуется разработка программ с помощью продуктов Microsoft Visual Studio.

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

Второй миф: Microsoft пытается отучить пользователей от графического интерфейса. Это тоже не так. Microsoft не поощряет практику использования оснащенных графическим интерфейсом консолей на серверах. Дело в том, что серверы могут обеспечивать эффективное функционирование графических интерфейсов лишь за счет ухудшения производительности сервера. Но использование графического интерфейса на клиентах, даже если эти клиенты подключены к серверу, вполне допускается и сегодня.

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

Итак, специалисты Microsoft явно заняты определением круга задач, которые можно будет решать с помощью графических консолей; в первую очередь, речь здесь идет о выполнении повседневных задач. Вполне возможно, что необычные или не столь часто встречающиеся задачи в конечном итоге можно будет решать только с помощью командной строки. Можете посокрушаться на сей счет, если вам не нравится такой поворот дела, но поймите следующее: если вы не включите в свой набор навыков умение работать с PowerShell, в перспективе это может отрицательно сказаться на вашей карьере.

Выполнение команд

Не следует полагать, что работа с PowerShell всегда связана с трудностями. Представьте, к примеру, что вам нужно добавить в Active Directory (AD) учетную запись нового пользователя. Задача решается довольно просто:

New-ADUser -Name DonJ -samAccountName DonJ -Title CTO -City «Las Vegas» -Department IT

Как видите, команда New-ADUser принимает несколько параметров командной строки. Эти параметры (-Name, -Title, -City и т.д.) соответствуют полям, с которыми вам пришлось бы иметь дело в случае добавления пользователя с помощью оснастки Active Directory Users and Computers. Так почему же нам предлагается работать не с графическим интерфейсом, а с командной строкой? Потому что командная строка облегчает процесс решения нескольких задач в ходе одной операции.

Допустим, вы получили электронную таблицу Microsoft Excel со списком новых пользователей, которым требуются учетные записи. В первой строке этой электронной таблицы содержатся заголовки столбцов: City, Title, Department, Name и samAccountName - атрибуты этих пользователей. Сохраните данный файл Excel в виде файла значений с разделителями-запятыми (файл CSV). Можете назвать его NewUsers.csv. Теперь вы сможете задействовать PowerShell для создания новых пользователей:

Import-CSV NewUsers.csv | New-ADUser

Нетрудно убедиться, что таким образом задача решается намного быстрее, чем в случае создания пользователей средствами графического интерфейса. PowerShell дает возможность создать 100 пользовательских учетных записей всего лишь за несколько секунд, тогда как на формирование такого количества учетных записей с помощью графического интерфейса пользователя может уйти несколько часов. Кстати, New-ADUser - это команда из модуля Microsoft ActiveDirectory; ее можно найти в комплекте Remote Server Administration Tools for Windows 7, а также в контроллерах доменов Windows Server 2008 R2 (и более поздних). Для загрузки модуля в память (после установки его в системе) нужно будет выполнить команду

Import-Module ActiveDirectory

Изучаем синтаксис

Самая трудная задача в ходе освоения любого интерфейса командной строки, command-line interface (CLI), - это изучение синтаксиса команд. Какие параметры нужно использовать? Как каждый из этих параметров влияет на выполнение команды и какие значения он принимает? Нередко администраторы часами выискивают примеры использования синтаксических конструкций с помощью поисковых программ. Но в среде PowerShell подобные проблемы решаются гораздо проще. Вам нужно выполнить некую операцию с той или иной службой?

Help *service*

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

Help Set-Service -full

Здесь важен параметр -full. Этот параметр позволяет получить массу дополнительной информации, включая подробные инструкции по применению каждого параметра, а также практические примеры. Вам нет нужды искать примеры с помощью поисковой системы Bing; они уже заложены в продукт.

Отметим, что некоторые пользователи вместо короткой команды Help используют более строгий вариант Get-Help. Я предпочитаю первое; в этом случае после отображения каждого экрана текста автоматически вставляется пауза. Использование формата Help избавляет вас от необходимости неоднократно нажимать кнопку More для продолжения знакомства с синтаксисом команды.

Кое-что о «подводных камнях»

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

Get-Process | Sort -Property VM -Descending | Select -First 10

На экране появляется то, что выдала последняя команда конвейера. Если на выходе последней команды ничего нет, экран остается пустым. А теперь выполните команду в таком формате:

Get-Process | Sort -Property VM -Descending | Select -First 10 | Export-CSV procs.csv

Команда Export-CSV не генерирует выходные данные, поэтому на экране ничего не отображается. Зато на диске появляется файл CSV, а это уже большое дело.

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

Get-Process | Sort -Property VM -Descending | Select -First 10 | Format-Table -Property ID,VM,PM,Name -autoSize

Однако четыре команды категории Format - Format-List, Format-Table, Format-Wideи Format-Custom - не генерируют традиционные выходные данные. Они формируют инструкции, в соответствии с которыми будет форматироваться содержимое экрана. Следовательно, команда, подобная приведенной ниже, не будет функционировать так, как можно было бы ожидать:

Get-Process | Sort -Property VM -Descending | Select -First 10 | Format-Table -Property ID,VM,PM,Name -autoSize | ConvertTo-HTML | Out-File procs.html

В роли входных данных для команды ConvertTo-HTML выступают инструкции по компоновке экрана, поэтому мы получим файл HTML, состоящий из этих инструкций. Последние же по большей части состоят из шестнадцатеричных кодов и мусора; во всяком случае, такими они представляются пользователю. Но эту западню легко обойти: достаточно воздерживаться от использования каких-либо команд после команды Format. Исключение можно сделать для команд Out-Printer и Out-File; обе они созданы специально для того, чтобы помочь пользователю разобраться в инструкциях по компоновке экрана.

Расширение оболочки

Подобно консоли управления Microsoft Management Console (MMC), оболочка PowerShell предусматривает возможность расширения, что позволяет применять в ней различные технологии. Как следует из таблицы, расширить оболочку можно двумя способами; выбор зависит от того, используете вы PowerShell версии 1 (v1) или версии 2 (v2). Оба метода обеспечивают возможность определять, какие расширения установлены в системе локально.

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

Некоторым пользователям досадно, что созданы некие версии PowerShell, предназначенные для взаимодействия с определенным продуктом, такие, как Exchange Management Shell или SharePoint Management Shell. На самом же деле никаких «особых» версий, ориентированных на взаимодействие с другими пакетами, не существует. Просто разработчики Microsoft дали некоторым функциям PowerShell имена, наталкивающие на ошибочный вывод. Пример - Exchange Management Shell. Это не более чем экранный ярлык меню Start. Просмотрите его свойства, и вы увидите, что данный ярлык всего лишь запускает на выполнение всем известный файл PowerShell.exe. Точнее говоря, он одновременно запускает программу PowerShell и выполняет в автоматическом режиме тот или иной сценарий либо загружает тот или иной модуль. Соответствующий модуль вы можете загрузить вручную. Загляните в свойства рассматриваемого ярлыка меню Start, определите, где расположен интересующий вас модуль, и запустите команду

Get-Module path-to-module

Таким образом, вы сможете загрузить в оболочку хоть все имеющиеся модули.

Объекты

Специалисты отрасли так много говорят об объектах в среде PowerShell, что некоторых это просто выводит из себя. Им тут же приходят в голову такие, скажем, мысли: «Это уже похоже на разработку, а я программистом не нанимался. Так что давайте как-нибудь без меня!».

Успокойтесь, коллеги. «Объект» - это всего лишь слово, и означает оно «структура данных». Представьте себе электронную таблицу Excel или даже таблицу базы данных Microsoft Access. Каждая строка в таблице или в электронной таблице представляет собой объект, а каждый столбец - свойство. Вот и все, ничего сложного. Команда

Get-Service

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

Например, удалять объекты, на которые вы не хотите смотреть. Или, используя команду Where-Object в качестве фильтра, убирать из конвейера те или иные элементы. Рассмотрим для примера такую команду:

Get-Service | Where { $_.Status -eq "Running" }

Она отображает список служб - но только тех, что выполняются в данный момент. Синтаксис запутанный, однако он поддается анализу. Внутри фигурных скобок (где перечисляются критерии объектов, которые вы хотите увидеть) содержится комбинация символов $_; это выходные данные предыдущей команды. Я не хотел просматривать весь объект service; мне нужно было поработать только с частью этого объекта. А как мы обозначаем часть или дробь в математике? Точкой, отделяющей дробь от целого (как в выражении «3.147», верно? Поэтому я поставил после символов $_ такую точку, а затем указал дробь, с которой мне нужно было поработать: Status. Из предшествующего опыта работы с командой Get-Service мне известно, что если в ячейке столбца Status указывается значение Running, речь идет о выполняемых в данный момент службах. Поэтому я указал, что мне требуются лишь те службы, значение которых, заданное в столбце Status, равно (equals, или с использованием оператора сравнения -eq) Running. Если вы хотите получить об операторах сравнения более подробную информацию, выполните команду

Help about_comparison_operators

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

Get-Service | Select -Property Name,Status

Изменяйте порядок сортировки. По умолчанию сортировка всегда осуществляется в порядке возрастания. При необходимости измените порядок на обратный:

Get-Service | Sort -Property Name -Descending

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

Get-Service | Sort -Property Status | Select -Property Name,Status

Интернет - не последняя инстанция

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

На сайте http://ShellHub.com я представил краткий перечень ресурсов PowerShell, авторы которых отстаивают не «программистский» подход, а более органичный для администраторов подход, предполагающий введение команды с клавиатуры с последующим нажатием клавиши ввода. Со временем вы наверняка начнете модифицировать свой метод работы, и он будет становиться все более сложным. И это замечательно. Но вы можете начать с простых вещей и добиваться превосходных результатов. Приведу такой пример. В книге Windows PowerShell Scripting and Toolmaking я начинаю с разъяснения простой команды, которую вы можете ввести с клавиатуры и немедленно получить результат. Постепенно я раскрываю все возможности этой команды: ввожу дополнительные параметры, привлекаю справочные материалы и т.д. - и наконец, одолев еще 100 страниц печатного текста, читатель воспринимает рассматриваемую команду как собственную команду PowerShell. Нет никакой нужды использовать оболочку PowerShell сразу во всей ее сложности. Начните с самого простого и постепенно беритесь за все более сложные задачи.

Не нужно начинать все с начала

На занятиях, посвященных среде PowerShell, я часто задаю своим студентам вопрос: «Как в PowerShell подключается сетевой диск?». В попытке найти ответ на этот вопрос многие обращаются к справочной системе. В ходе поисков студенты часто останавливают свой выбор на New-PSDrive, что, кстати, не является правильным ответом; эти накопители не видны за пределами PowerShell. В конце концов я объявляю им правильный ответ: Net Use.

Присутствующим остается лишь сокрушаться: «Ну почему это не пришло мне в голову?». Что ж, студенты получили хороший урок: Microsoft не предлагает нам забыть все, что мы уже знаем. Странно, правда? Все известные нам по окну командной строки приемы - Net Use, Icacls, DsAcls, NSLookup, Ping, Ipconfig, Pathping - по-прежнему функционируют, так что продолжайте с ними работать. Более того, эти средства можно свободно использовать совместно с собственными командами PowerShell. Так что если вы уже знаете, как решается та или иная задача, не ломайте голову над тем, как это делается в среде PowerShell. Смело применяйте известные вам приемы.

Почему некоторые администраторы не решаются приступать к изучению PowerShell?

Я открою вам маленький секрет. Многие администраторы стали администраторами Windows (а не администраторами UNIX или других систем) потому, что с Windows работать проще, по крайней мере, на первый взгляд. Запустите парочку мастеров, нажмите две-три кнопки - и ваша работа сделана. Многие из таких администраторов, в сущности, очень слабо представляют, какие именно процессы скрывают от нас эти кнопки и мастера. Вот почему перспектива освоения PowerShell пугает их. Дело не в том, что таким администраторам страшно браться за изучение синтаксиса, и не в том, что они считают нудным делом ввод данных с клавиатуры. А дело в том, что, работая с графическим интерфейсом, эти администраторы привыкли, что их, что называется, буквально «водят за ручку», тогда как PowerShell явно нарушает эту традицию.

Умение эффективно работать с PowerShell предполагает четкое понимание процессов, протекающих в системах, которыми вы управляете. Навыки применения PowerShell - признак первоклассного, знающего администратора. К сожалению, за годы, когда внутренние механизмы системы были скрыты от нас графическим интерфейсом, многие из наших коллег утратили часть знаний, которыми они должны владеть. Мне приходилось беседовать с администраторами, которые никогда не пользовались утилитой проверки связи Ping, которые без оснащенного графическим интерфейсом инструмента не могут отыскать причины неполадок в механизме репликации AD и которые имеют весьма слабое представление о том, как почтовые сообщения выстраиваются в очередь и доставляются в системе Exchange. Таким администраторам трудно овладеть навыками работы с PowerShell.

А вот вопрос для вас, уважаемые читатели. Скажите, можете ли вы создать пользовательскую учетную запись AD с незаполненным именем входа? Ответ: да, но только одну. Разумеется, применивший эту учетную запись пользователь не сможет зарегистрироваться в системе, но, с другой стороны, единственное требование к имени входа со стороны AD состоит в том, чтобы это имя было уникальным. Незаполненное имя уникально в первый раз, когда вы его используете; и только попытка создать второго пользователя с незаполненным именем приведет к сбою. Разумеется, если вам доводилось обращаться к AD только через графическую консоль, вам это обстоятельство неизвестно, поскольку графическая консоль вообще не принимает «незаполненных» имен. Но если внутренние механизмы AD известны вам досконально, ответ будет вполне очевиден.

PowerShell требует от администратора именно таких твердых навыков и глубоких знаний. Радует то, что специалистам, обладающим подобными навыками и знаниями, будет намного проще выполнять такие задачи, как диагностика, проектирование архитектуры, планирование и т.д. Овладев эффективными методами работы с PowerShell, вы станете более квалифицированным администратором, и причиной тому будет не система PowerShell, а технические знания, которые вам придется усвоить. Так что за дело.

Учитесь - или ищите другую работу

Я люблю повторять слова, которые стали моей присказкой: «Изучайте PowerShell или учитесь произносить фразу: "А чипсы будете заказывать?"». Я уже сегодня вижу, как в различных организациях администраторов, не способных работать с PowerShell, задвигают на вторые роли. И действительно, если владение технологией PowerShell - признак квалифицированного, знающего администратора, почему не сохранять и не продвигать таких сотрудников, избавляясь от их менее осведомленных коллег? Опыт и знания в области PowerShell - более надежный показатель высокой квалификации, нежели любой сертификационный экзамен, устроенный специалистами Microsoft. Если вы полагаете, что получили свою работу в первую очередь благодаря сертификатам, уж будьте уверены: знание PowerShell еще важнее.

На эту ситуацию можно взглянуть и под другим углом. Если вы ценны для своей компании только тем, что способны нажимать на кнопки Next, Next, Finish и при этом не понимаете, что происходит «под капотом» и как можно автоматизировать задачу, чтобы она выполнялась быстрее и эффективнее... Ну, тогда вы относитесь к той категории работников, которых я называю «обезьяна у кнопки». Иными словами, заменить вас можно, что называется, в два счета. Что касается меня, я предпочитаю быть специалистом, обладающим доступными только для посвященных знаниями о том, как автоматизировать работу. Это избавляет меня от необходимости выполнять скучные повторяющиеся операции. А, кроме того, такого сотрудника будет не так-то просто уволить.



Существуют вещи, которые мы выполняем каждый день, будучи администраторами сети Windows, но если бы нас попросили сделать их с помощью командной строки, в отличие от администраторов Linux, для нас, администраторов Windows, это было бы весьма проблематично. Windows всегда был слаб, когда речь шла об инструментах командной строки. На мой взгляд, все изменилось с появлением Windows Powershell. С помощью Powershell (или по-другому PS) можно выполнить столько различных функций, которые мы не могли выполнять ранее. В этой статье мы сконцентрируемся на том, как Powershell может помочь нам выполнять некоторые общие сетевые функции из командной строки. Продолжайте читать, чтобы узнать больше!

Что такое Powershell?

Powershell – это устанавливаемая функция Windows Server 2008. Чтобы установить Powershell, вы должны установить функцию Powershell с помощью мастера добавления функций. Процесс установки занимает около минуты, и как только компонент установлен, у вас появляется доступ к удивительному языку сценариев командной строки. В отличие от других сценарных языков в Windows, Powershell создан исключительно для системных администраторов. Powershell использует.NET и команды ("cmdlets" или "command-lets") в своей работе. Будучи пользователем PS, вы можете использовать команды по отдельности или связывать их вместе, чтобы выполнять более сложные задачи.

Когда вы установили PS, вы сможете запустить Пуск -> Все программы -> Windows Powershell 1.0 , и нажать Windows PowerShell . На этом этапе у вас должно появиться голубое окно CLI, которое выглядит, как показано на рисунке 1.

Рисунок 1: Окно Windows Powershell Command

Вы всегда можете сказать, что работаете в Powershell, поскольку в окне "PS" в начале всегда есть следующая строка:

PS C:\Users\Administrators

Теперь, когда powershell установлен и его окно открыто, позвольте мне показать вам некоторые общие сетевые задачи, которые можно выполнить в PS.

Перечислить IP адреса вашего сервера

Чтобы получить список IP адресов на вашем сервере Windows 2008 Server, вам нужно использовать следующую команду:

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE - ComputerName . | Select-Object -Property IPAddress

Вот как выглядят данные после использования этой команды на моем Windows 2008 Server:

Рисунок 2: Перечисление IP адресов с помощью Windows Powershell

Как видно из рисунка, исходные данные показывают нам, что у меня есть один адаптер с IP V4 адресом и IP V6 адресом на этом сервере Windows 2008 Server. Само по себе, это не является чем-то удивительным, но подумайте о том, что вы сможете сделать с этим, используя другие сценарные функции.

Как учит нас руководство пользователей powershell, результирующие данные являются массивом и вы можете посмотреть IP адрес лишь направив эти данные в "Select-Object" (после отключения IPV6), примерно так:

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE - ComputerName . | Select-Object -ExpandProperty IPAddress

Рисунок 3: Перечисление IP адреса ТОЛЬКО с Windows Powershell

Получение списка конфигурации сетевого адаптера с помощью Powershell

Чтобы посмотреть основную конфигурацию вашего сетевого адаптера, вы можете использовать следующую команду:

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE "ComputerName .

Хотя данная статья посвящена рассмотрению использования PS в Windows Server 2008, эта утилита также может использоваться и в Windows XP, Vista или Server 2003. Вот пример полученных данных команды, запущенной на моей рабочей станции Windows XP:

Рисунок 4: PowerShell показывает конфигурацию сетевого адаптера на Windows XP

Тестовый опрос компьютера с помощью PowerShell

Хотя командная строка PS все же может выполнять все обычные команды Windows (например тестовый опрос), сильная сторона Powershell заключается в том, что вы можете взять полученные данные и с легкостью изменить их.

Вот пример того, как это можно сделать, предоставлено руководством пользователя Windows Powershell. В этом примере результаты Win32_PingStatus анализируются с помощью Select-Object. В этом случае данные просто показывают время ответа и код статуса.

Вот команда, которая использовалась:

Get-WmiObject -Class Win32_PingStatus -Filter "Address="127.0.0.1"" - ComputerName . | Select-Object -Property Address,ResponseTime,StatusCode

А вот результаты использования команды на моей машине Windows:

Рисунок 5: PowerShell данные показывают статус опроса, анализируемого с помощью Select-Object

Разрешение общего доступа к папке с помощью Windows Powershell

Буду с вами откровенен. Использование команд Powershell не всегда настолько просто, как использование существующих команд Windows, с которыми вы уже знакомы. Вот пример.

Следующая команда PS обеспечит общий доступ к папке в C:\temp в качестве "davidtemp" и применит к ней отличную команду:

(Get-WmiObject -List -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Win32_Share"}).InvokeMethod("Create",("C:\temp","davidtemp",0,25,"David"s Temp Folder"))

С другой стороны, вы могли просто использовать уже проверенную и опробованную команду net share :

Net share davidtemp=C:\temp /remark:"David"s Temp Shared Folder"

Рисунок 6: PowerShell данные и традиционная команда net share

Обратите внимание на то, что команда Powershell не просто не сработала, но выдала мне ужасную ошибку. Я пробовал эту команду на Windows XP и Vista и я был администратором системы.

С другой стороны, команда net share очень проста и сработала с первой попытки. И хотя я пытаюсь рассказать вам о принципах работы с Powershell, не забывайте о том, что Powershell может использовать традиционные сетевые команды Windows, которые во многих случаях гораздо проще использовать. Однако вы можете оказаться в ситуации, в которой эти традиционные команды не делают всего того, что вам необходимо, и именно здесь на помощь придет Powershell.

Прочие сетевые и более сложные команды

Если вы собираетесь использовать только самые основные сетевые команды администрирования в Powershell, вы, возможно, запутаетесь и не будете их больше использовать, потому что, как и в любом другом сценарном языке, здесь нужно учиться.

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

Как вы, возможно, заметили из предыдущих примеров, одним из параметров для большинства команд Powershell является "computername". Когда мы ставим точку (".") вместо имени компьютера (computername), это будет локальный хост (наш компьютер). Однако мы также можем заменять любой IP адрес или имя компьютера Windows в домене, что дает нам возможность использовать эти команды не только на нашем ПК, но и создавать мощные сценарии в Powershell, которые можно применять на всех компьютерах сети.

Например, вот команда, которая передает IP адрес компьютера Dell через LAN:

Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE - ComputerName DELL9400

Вот результаты этой команды:

Рисунок 7: Результаты Powershell получения IP адреса с удаленного ПК

А вот увеличенное изображение, показывающее необходимую информацию:

Рисунок 8: Увеличение окна результатов Powershell получения IP адреса удаленного ПК

Итак, возможность работать с удаленными компьютерами является основной функцией Powershell, однако еще одной мощной возможностью является возможность фильтрации данных и сочетания данных, полученных от использования разных команд.

Взгляните на следующий пример:

"127.0.0.1","localhost","research.microsoft.com" | ForEach-Object -Process {Get- WmiObject -Class Win32_PingStatus -Filter ("Address="" + $_ + """) -ComputerName .} | Select-Object -Property Address,ResponseTime,StatusCode

В этом примере был получен список IP адресов и имен домена. Этот список был передан на "ForEach-Object". Для каждого из этих «объектов» (IP адрес / доменные имена), использовался элемент "Get-WmiObject" PingStatus. Затем данные тестового опроса каждого имени домена были пропущены через "Select-Object", в результате чего были отображены только адреса, время ответа и коды статуса.

Рисунок 9: Тестовый опрос с помощью списка при сочетании и опросе данных

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

Что еще нужно знать?

Заключение

Windows Powershell – это очень мощная утилита. В этой статье невозможно описать всего того, что вы сможете сделать с помощью Powershell, но надеюсь, что мне удалось дать вам общую картину возможностей этой утилиты и вдохновить вас на последующие изыскания в этой области. С каждым днем появляются новые книги, курсы и уйма материала в Интернете о функциях Powershell, которые могут использоваться системными администраторами Windows. Учитывая столь сильную привязанность администраторов Windows к графическому интерфейсу, потребуется время на то, чтобы Powershell была принята в тех компаниях, в которых не испытывают острой необходимости в этом инструменте. Я уверен, что администраторы будут использовать Powershell для создания более коротких сценариев, с помощью которых можно будет выполнять более сложные задачи. Надеюсь, что Powershell будет обретать все большую популярность по всему миру!

Особая благодарность компании Microsoft за предоставление примеров команд в документации руководства пользователя Windows Powershell.

Опытные пользователи операционной системы Windows 10 могли слышать об утилите командной строки PowerShell. Также с ней могут быть знакомы имеющие опыт работы с Windows 7 и 8.1. После многих лет использования приложения командной строки Windows и файлов формата.bat пришло время познакомиться с более функциональным инструментом.

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

Шаг 1: установка

Для начала нам необходима сама утилита PowerShell. Если вы работаете с Windows 10, у вас уже установлена версия PowerShell 5. Обновление Windows 10 Anniversary Update использует версию 5.1, но разница незаметна. В Windows 8 и 8.1 применяется PowerShell 4, чего тоже вполне достаточно. Установка PowerShell на Windows 7 не доставит проблем, но всё же пару лишних шагов придется сделать. В частности, нужно дополнительно установить.Net Framework. Можно установить Windows Management Framework, в состав которого входит PowerShell.

У PowerShell есть два интерфейса. Опытные пользователи могут выбрать полноценный графический интерфейс, известный как Integrated Scripting Environment (ISE). Новичкам лучше использовать консоль PowerShell, простой текстовый интерфейс в стиле командной строки Windows или даже DOS 3.2.

Для запуска PowerShell от имени администратора в Windows 10 нажмите на кнопку «Пуск» и прокрутите список приложений до Windows PowerShell. В Windows 8.1 ищите Windows PowerShell в папке System в Windows. В Windows 7 оболочка располагается в папке Accessories. В качестве обычного пользователя PowerShell можно запустить точно так же, используя левую кнопку мыши вместо правой.

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

Шаг 2: старые команды Windows

Синтаксис команд Windows в PowerShell работает привычным образом. Например, cd меняет папки, dir показывает список всех файлов и папок внутри текущей папки.

В зависимости от метода запуска консоли PowerShell можно начать в c:\Windows\system32 или в c:\Users\ . В примере на скриншоте используется команда cd .. (с пробелом) для перехода на один уровень вверх за раз, затем запускается команда dir для отображения списка файлов и папок в директории C:\ .

Шаг 3: установка файлов помощи

Команды вроде cd и dir не являются активными командами оболочки PowerShell. Это так называемые псевдонимы (aliases) — замены настоящих команд PowerShell. Псевдонимы удобны для тех, кто имеет большой опыт работы с командной строкой. Однако они не затрагивают глубин PowerShell.

Чтобы начать знакомиться с возможностями PowerShell, наберите help и нужную вам команду. На скриншоте показана команда .

Команда help говорит, что dir является псевдонимом команды PowerShell Get-ChildItem . Если набрать get-childitem в PS C:\> , увидите то же самое, что и при использовании команды dir .

Как указано внизу скриншота, файлы помощи для PowerShell не устанавливаются автоматически. Для их получения запустите PowerShell от имени администратора и наберите update-help . Установка файлов помощи займёт несколько минут, ряд модулей могут отсутствовать — например, в данном случае не установились Help for NetWNV и SecureBoot. Когда всё готово, полная система помощи всегда будет давать нужные подсказки.

Теперь наберите команду get-help и любую интересующую вас команду («cmdlet» на языке PowerShell, по-русски командлеты), будет показано её описание. Например, get-help get-childitem выдаёт список опций get-childitem . Также можно вывести разные возможные варианты. Например

get-help get-childitem -examples

выдает семь подробных примеров использования get-childitem . Команда

get-help get-childitem -detailed

включает в себя эти семь примеров и подробные разъяснения каждого параметра в командлете get-childitem .

Шаг 4: получение помощи по параметрам

На скриншоте вы могли заметить два списка под SYNTAX для get-childitem . Наличие двух разных синтаксисов означает возможность применения двух способов запуска командлет. Как держать синтаксис отдельно друг от друга и что означают параметры? Ответ простой, если знать трюк.

Для получения подробностей относительно параметров командлеты get-childitem или любой другой используйте параметр -full :

get-help get-childitem -full

Это выдает список того, что вы можете сделать с командлетой и что случится. Смотрите на скриншот.

Просмотр описания параметров позволяет заметить, что get-childitem даёт возможность получить объект child (вроде названия подпапки или имени файла) в указанном месте, с совпадением определённых символов или без. Например:

get-childItem “*.txt” -recurse

возвращает список файлов «*.txt» в текущей папке и всех подпапках (из-за параметра -recurse ). Тогда как

get-childitem “HKLM:\Software”

возвращает список всех ключей реестра верхнего уровня в HKEY_LOCAL_MACHINE\Software .

Если вы когда-нибудь пытались попасть в реестр при помощи командной строки Windows или файлов.bat, вы сможете оценить функциональность этого варианта доступа.

Шаг 5: изучение имён

Есть причина того, почему показанные до сих пор командлеты выглядят сходным образом: get-childitem, update-help, get-help используют единую схему глагол-существительное. Это соглашение применяют все командлеты PowerShell, в них глагол стоит перед единственным существительным. Это понравится тем, кто в своё время пострадал от непостоянства названий команд в языках VB и VBA.

Взгляните на самые распространенные командлеты:

set-location : устанавливает текущую рабочий локацию на определённую локацию

get-content : получает содержимое файла

get-item : получает файлы и папки

copy-item : копирует объект из одной локации в другую

remove-item : удаляет файлы и папки

: получает процессы, запущенные на локальном или удаленном компьютере

get-service : получает сервисы, запущенные на локальном или удаленном компьютере

invoke-webrequest : получает содержимое с веб-страницы в интернете

Для просмотра работы определённой командлеты используйте get-help как в случае

get-help copy-item -full

На основе описания в помощи можно понять, что необходимо командлете. Например, если вы хотите копировать все файлы и папки из Documents в c:\temp , используйте

copy-item c:\users\ \documents\* c:\temp

Введя эту команду, вы увидите несколько интересных возможностей окружения PowerShell. Например, если набрать copy-i и нажать кнопку Tab, PowerShell заполнит Copy-Item . Если неправильно набрать командлету и PowerShell не может распознать её, даётся полное описание того, что было сделано не так.

Попробуйте данную командлету:

invoke-webrequest askwoody.com

Вы получите краткий список заголовков, изображений, ссылок и прочего содержимого веб-страницы. Обратите внимание в get-help на список invoke-webrequest , который «возвращает коллекцию форм, ссылок, изображений и прочие важные элементы HTML» — именно то, что должно показываться на экране.

Некоторые командлеты помогают управлять самим PowerShell:

get-command : список всех доступных командлет

get-verb : список всех доступных глаголов

clear-host : очистка экрана программы-хоста

Разные параметры позволяют уменьшать команды и сужать круг полезных опций. Например, для просмотра списка всех командлет, работающих с сервисами Windows, введите

get-command *-service

Будут показаны все глаголы, доступные с существительным service . Вот их список:

Get-Service

New-Service

Restart-Service

Resume-Service

Set-Service

Start-Service

Stop-Service

Suspend-Service

Можно объединять эти командлеты с другими.

Шаг 6: использование труб

Если вы знакомы с командной строкой Windows или пакетными файлами, то знаете о перенаправлении и трубах. Перенаправление (символ >) и трубы (символ |) берут результат действия и прикрепляют его в другое место. Например, можно перенаправить результат команды dir в текстовый файл или передать результат команды ping в команду find для фильтрования интересных результатов, вроде

dir > temp.txt

ping askwoody.com | find “packets” > temp2.txt

Здесь во второй команде find ищет строку packets , взятую из адреса askwoody.com командой ping и объединяет все совпадающие строки в файл под названием temp2.txt .

Первая из этих команд отлично работает в PowerShell. Для запуска второй команды потребуется нечто вроде

ping askwoody.com | select-string packets | out-file temp2.txt

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

Powershell обладает поддержкой pipe , причём она не ограничена текстом. PowerShell позволяет передавать целый объект из одной командлеты в другую, где объект представляет собой комбинацию данных (называемых свойствами) и действий (методов), которые могут использовать эти данные.

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

Как это понять? Используйте командлету get-member . Если вы хотите знать, какой тип объекта обрабатывает командлета, проведите её через get-member . Например, если вы пытаетесь понять запущенные на компьютере процессы и сузили опции до командлеты , вот как узнать результат командлеты:

get-process | get-member

Запуск этой командлеты выдаёт длинный список свойств и методов для , но в самом начале списка можно увидеть тип объекта, который создает :

TypeName: System.Diagnostics.Process

Нижеприведенный скриншот также показывает свойства под названием get-process Handles, Name, NPM, PM, SI, VM и WS .

Если вы хотите манипулировать результатом для работы с этим командлетом (вместо отображения длинного списка активных процессов на мониторе), нужно найти другую команду, которая в качестве вводных данных принимает System.Diagnostics.Process . Для поиска нужной командлеты снова используйте возможности PowerShell:

get-command -Parametertype System.Diagnostics.Process

Эта командлета выдает список командлет, которые могут обрабатывать System.Diagnostics.Process .

Некоторые командлеты известны тем, что принимают почти любой вид данных. Главной среди них является . Эта командлета пропускает через себя каждый посылаемый по трубе объект, один за одним, и применяет к нему заданной критерии выбора. Существует специальный маркер под названием $_ , который позволяет использовать каждый предмет в трубе, один за раз.

Допустим, вы хотите получить список всех запущенных на компьютере процессов с названием «svchost», то есть хотите сопоставить свойство Name процессу svchost . Используйте команду:

get-process | where-object {$_.Name -eq “svchost”}

Командлета смотрит на каждый объект System.Diagnostics.Process , сравнивает .Name этого объекта с «svchost»; если есть совпадения, они выдаются на монитор. Смотрите на скриншот.

Шаг 7: анализ полезных команд PowerShell

К настоящему времени вы уже знаете достаточно много, чтобы суметь нанести урон компьютеру, так что будьте осторожны. Посмотрим, например, часто запрашиваемые команды PowerShell.

Эти команды работают только в Windows 10 и только при запуске PowerShell от лица администратора. Они предназначены для переустановки предустановленных приложений Windows 10 и могут пригодиться тем, кто сначала удалил эти программы, а затем решил вернуть их. Команды выглядит следующим образом:

Get-AppXPackage | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

Если запустить эту команду, игнорируйте обозначенные красным цветом предупреждения, и когда команда выполнена, перезагрузите компьютер; все предустановленные программы в Windows 10 появятся на своих местах.

Вот как работает данная команда. Get-AppXPackage проверяет все пакеты приложений в профиле пользователя. Даже если вы удалили приложение, оно остается в списке профиля пользователя.

Командлета Get-AppXPackage возвращает объект TypeName Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage , который включает в себя полное имя пакета приложения и местонахождения соответствующего файла манифеста XML. Если запустить командлету get-appxpackage , вы увидите длинный список пакетов приложений. Скриншот показывает описание приложения Xbox.

Командлета Foreach посредством цикла проходит через каждый объект в AppXPackage , отправляя их командлету Add-AppxPackage . Согласно get-help для Add-AppxPackage , тут есть два ключевых переключателя:

  • Переключатель -Register используется для регистрации существующих установок пакетов приложений, можно задать параметры DisableDevelopmentMode и Register
  • Переключатель -DisableDevelopmentMode говорит Windows заново зарегистрировать существующий пакет приложения, который был отключён, не зарегистрирован или повреждён.

Строка «$($_.InstallLocation)\AppXManifest.x ml» описывает, где расположен файл manifest.xml . Если посмотреть на файлы AppXManifest.xml , вы увидите сложный список идентификаторов приложений, исполняемых файлов и большое количество визуальных элементов, связанных с приложением.

После перезагрузки все добавленные пакеты приложений скачиваются и устанавливаются из магазина Windows Store.

В данной статье мы рассмотрим такую технологию от компании Microsoft как Windows PowerShell , мы поговорим о том, что такое PowerShell, что такое командлеты и конвейер, как писать сценарии и модули, а также затронем другие не менее важные и полезные возможности Windows PowerShell.

Что способствовало появлению Windows PowerShell?

До появления PowerShell существовали (и существуют ) следующие инструменты для автоматизации и администрирования сервисов: командная строка Windows и Windows Script Host. Но у этих технологий есть недостатки.

У командной строки Windows есть и возможность выполнять какие-то административные задачи и возможность записать алгоритм действий, сохранив его в виде скрипта (bat-файла), при этом можно использовать некие элементы программирования, например, использовать переменные, условные конструкции и даже что-то вроде циклов.

Большинство программных продуктов имеет консольный интерфейс, т.е. мы можем управлять программой, используя командную строку, при этом экономя ресурсы за счет отсутствия затрат на работу графического интерфейса. Компания Microsoft для серверной операционной системы Windows Server даже выпускает редакции без графического интерфейса (Server Core, в Windows Server 2016 даже есть Nano Server ), но всего этого недостаточно, так как возможности командной строки ограничены, т.е. написать какую-то сложную логику для автоматизации чего-либо мы не сможем, а если и сможем, то на это нам потребуется время и знания.

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

Технология Windows Script Host позволяет выполнять все административные задачи, что и командная строка, включая их автоматизацию путем написания WSH скриптов , но здесь мы уже можем использовать полноценные языки программирования (VBScript и JScript ), т.е. можно реализовывать сложную логику и алгоритмы. К тому же с помощью WSH мы управляем программными продуктами через объектный интерфейс, другими словами Windows Script Host намного «круче » чем командная строка. Но данная технология также не стала тем идеальным инструментом администрирования и автоматизации этого администрирования для системных администраторов, так как Windows Script Host требовал знаний вышеперечисленных языков программирования, что для системных администраторов на самом деле лишнее. Администраторам нужно всего лишь простой инструмент администрирования с возможностью запрограммировать какие-то действия, а углубляться в объектные модели программных продуктов на языках программирования VBScript и JScript им не хочется.

В итоге компании Microsoft необходимо было разработать такой инструмент администрирования для системных администраторов, который бы на 100 процентов удовлетворял все потребности сисадминов как в плане возможностей администрирования и автоматизации, так и в плане удобства и простоты использования, таким образом, появился Windows PowerShell.

Что такое Windows PowerShell?

Windows PowerShell – это язык сценариев и командная оболочка Windows, которые разработаны для администрирования и конфигурирования операционных систем Windows. PowerShell разработан на основе среды CRL и платформы.NET Framework и в отличие от командной строки, которая принимает и возвращает текст, Windows PowerShell работает с объектами. У каждого объекта в PowerShell есть свойства и методы, которые можно использовать для управления этими объектами.

В Windows PowerShell Microsoft разработала концепцию командлетов (cmdlets ), которая представляет собой систему именования команд «Глагол-Существительное ». Данная система позволяет системным администраторам быстрей освоить и упростить работу с PowerShell.

С помощью Windows PowerShell можно:

  • Получать доступ к файловой системе;
  • Управлять реестром;
  • Управлять службами;
  • Управлять процессами;
  • Настраивать операционную систему;
  • Устанавливать программное обеспечение;
  • Устанавливать роли и компоненты сервера;
  • Осуществлять администрирование и конфигурирование ролей и компонентов сервера;
  • Писать и использовать сценарии для автоматизации управления и администрирования;
  • Выполнять другие задачи системных администраторов.

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

Также для удобства многие часто используемые команды и утилиты в PowerShell имеют синонимы (Alias ), например cls - это синоним командлета Clear-Host, dir синоним Get-ChildItem (полный список синонимов можно посмотреть путем запуска командлета Get-Alias ).

Для упрощения поиска нужной команды в PowerShell есть специальный командлет Get-Command, с помощью которого можно осуществлять поиск, как по глаголу, так и по существительному. Все команды в Windows PowerShell сгруппированы в модули (например, Hyper-V, NetTCPIP ), что также упрощает поиск нужной команды.

После того как нужная команда найдена, можно посмотреть инструкцию по работе с этой командой, т.е. справку, для этих целей есть специальный командлет Get-Help, например следующая команда покажет справку по командлету Get-Command:

Get-Help Get-Command

Справка в Windows PowerShell может быть краткой, детальной (параметр -Detailed ), полной (параметр -Full ), а также можно выводить только примеры (параметр - Examples ). Следующая команда покажет только примеры использования командлета Get-Command:

Get-Help Get-Command -Examples

Справка PowerShell обновляемая, т.е. ее можно обновить командой Update-Help.

Версии Windows PowerShell

Первая версия PowerShell 1.0 появилась 14 ноября 2006 года и выпускалась в виде отдельного дистрибутива, который можно было установить на следующие версии операционных систем Windows: Windows XP Service Pack 2, Windows Server 2003 Service Pack 1 и Windows Vista.

В Windows Server 2008 PowerShell 1.0 поставлялся в виде компонента, который также нужно было устанавливать.

Начиная с Windows 7 и Windows Server 2008 R2, PowerShell поставляется как неотъемлемый компонент системы (т.е. предустановленный, устанавливать его не надо ). Ниже представлена таблица соответствия версии PowerShell и версии операционной системы Windows (т.е. какая версия PowerShell по умолчанию установлена в той или иной версии Windows ):

Версия PowerShell Версии Windows
PowerShell 2.0 Windows 7, Windows Server 2008 R2
PowerShell 3.0 Windows 8, Windows Server 2012
PowerShell 4.0 Windows 8.1, Windows Server 2012 R2
PowerShell 5.0 Windows 10, Windows Server 2016

С каждой новой версией PowerShell становится все более мощным инструментом администрирования, для сравнения в первой PowerShell было около 130 командлетов, а в PowerShell 5.0 их уже более 600!

Узнать текущую версию PowerShell можно с помощью свойства PSVersion встроенной переменной $PSVersionTable, например, выполните следующую команду:

$PSVersionTable.PSVersion

Или запустите командлет

Get-Variable -Name PSVersionTable –ValueOnly

где, значение PSVersion и будет версией PowerShell.

Язык PowerShell

PowerShell – это объектно-ориентированный скриптовой язык программирования. Он используется для написания команд управления всеми компонентами операционной системы Windows в оболочке Windows PowerShell, а также для написания сценариев автоматизации задач администрирования в интегрированной среде сценариев Windows PowerShell (ISE). Язык PowerShell хоть и создан для задач администрирования, он является полноценным скриптовым языком программирования, так как имеет программные конструкции, которые присутствуют в каждом языке программирования, такие как: условия, циклы, обработка ошибок, работа с переменными, объектами, массивами.

Язык PowerShell имеет единый синтаксис написания команд и структуру именования этих команд по принципу «Глагол-Существительное », что делает данный язык интуитивно понятным как для программистов, так и для системных администраторов.

Оболочка Windows PowerShell

Оболочка Windows PowerShell – это среда выполнения команд и сценариев на языке PowerShell. Данная оболочка имеет те же возможности что и командная строка такие как: хранение истории выполнения команд, настройка внешнего вида оболочки, завершение выполнения команд сочетанием клавиш Ctrl+C, а также много других возможностей, которых нет в оболочке командной строки, например такая замечательная возможность как «подсветка синтаксиса » (появилась в PowerShell 5.0 ).

Запустить оболочку PowerShell можно несколькими способами, например:

  • Из командной строки, набрав PowerShell;
  • Через диалоговое окно «Выполнить » (сочетание клавиш Win+R ), также набрав PowerShell;
  • В Windows 7 - Пуск->Все программы ->Стандартные ->Windows PowerShell -> Windows PowerShell;
  • В Windows 8.1 или Windows Server 2012 R2 - Пуск->Все программы ->Служебные ->Windows PowerShell;
  • В Windows 10 или Windows Server 2016 - Пуск->Все программы -> Каталог Windows PowerShell (в группе W ) -> Windows PowerShell.

Пример запуска PowerShell в Windows Server 2016

Скриншот оболочки PowerShell в Windows Server 2016

Командлеты в PowerShell

Командлет (cmdlet ) – это команда Windows PowerShell, с помощью которой можно осуществлять взаимодействие с объектами операционной системы с целью их управления. Данные команды являются частью языка PowerShell. Командлеты построены по принципу «Глагол-Существительное », разделенные дефисом (-); другими словами, мы сначала указываем, что делать, а через дефис - над чем. Например, командлет Get-Help, где Get - это глагол, означающий «Получить », а Help - существительное «Помощь » в контексте PowerShell «Показать – Справку ». Командлеты PowerShell возвращают результаты в виде объектов, что является одним из главных отличий от командной строки Windows, в которой команды возвращают только текст на экран.

Кроме командлетов на получение данных (Get), существуют и такие типы командлетов как:

  • Add – добавление данных;
  • Clear – очистить;
  • Enable – включить;
  • Disable – выключить;
  • New – создать;
  • Remove – удалить;
  • Set – задать;
  • Start - запустить;
  • Stop – остановить;
  • Export – экспортировать;
  • Import – импортировать;
  • И еще много других.

Полный список командлетов в Windows PowerShell можно посмотреть с помощью специального командлета Get-Command. Например, запустите его с параметром -CommandType cmdlet, в итоге на экране у Вас отобразится список командлетов.

Get-Command -CommandType cmdlet

Как Вы уже поняли, у командлетов есть параметры, с помощью которых мы можем конкретизировать действия командлета. Параметры бывают обязательные и необязательные, например, у командлета Get-Command обязательных параметров нет.

Ниже на картинке представлен способ поиска командлета по глаголу (параметр Verb ). В данном случае у нас отобразился список командлетов, которые умеют что-то перезапускать.

Команда

Get-Command -Verb Restart

Для поиска командлета по существительному необходимо использовать параметр Noun. Например, ниже мы получили список командлетов, которые работают со службами.

Команда

Get-Command -Noun Service

Если Вы не нашли нужный командлет по полному названию можете использовать маску в формате *Текст*.

Конвейер в PowerShell

Одной из главных возможностей Windows PowerShell является возможность использования конвейера при выполнении команд.

Конвейер – это передача результата работы командлета через вертикальную черту (|) другому командлету. При этом, как Вы помните, в PowerShell командлеты работают с объектами и возвращают объекты, соответственно по конвейеру передаются также объекты.

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

Например, давайте узнаем название самого большого файла в каталоге «C:\Windows\System32» (простой пример конвейера ).

Команда

Get-ChildItem -Path "C:\Windows\System32" -File | Sort-Object length -Descending | Select-Object -First 1

  • Get-ChildItem – командлет получения объектов в указанном каталоге;
  • Sort-Object – командлет для сортировки объектов, в нашем случае мы сортируем по размеру файла (length -Descending );
  • Select-Object – командлет выбора нужных свойств объекта, в нашем случае мы выводим стандартные поля и только самый первый объект, т.е. большой файл (параметр -First 1 ).

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

Фоновое исполнение заданий

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

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

В Windows PowerShell для работы с фоновыми заданиями есть следующие командлеты:

  • Start-Job – запустить фоновую задачу;
  • Stop-Job – остановить фоновую задачу
  • Get-Job – посмотреть список фоновых задач;
  • Receive-Job – посмотреть результат выполнения фоновой задачи;
  • Remove-Job – удалить фоновую задачу;
  • Wait-Job – перевести фоновую задачу на передний план, для того чтобы дожидаться ее окончания.

Для запуска в фоновом режиме необходимо написать команду Start-Job, а в фигурных скобках {} команду или набор команд, которые необходимо выполнить в фоновом режиме.

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

Запуск задачи в фоновом режиме

Start-Job {Get-Service}

Смотрим на список задач запущенных в фоновом режиме

Отображаем результат работы задания Job1

Receive-Job Job1

Как видим, у нас появилась задача со статусом «Completed », т.е. она уже выполнилась (просто Get-Service отрабатывает быстро ).

Для того чтобы посмотреть результат работы фоновой задачи, т.е. командлета Get-Service, мы выполнили команду Receive-Job и передали ей имя задания (можно и значение идентификатора ). В результате у нас отобразился список служб.

Удаленное управление на PowerShell

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

Существует несколько способов удаленного управления:

  • С помощью параметра –ComputerName (есть у многих команд ). Другими словами Вы передаете имя компьютера, на котором необходимо выполнить команду, в качестве параметра. Способ обладает недостатком, так как ограничивается выполнением одной команды;
  • С помощью сессий. Командлет Enter-PSSession (интерактивный сеанс ). Таким способом Вы подключаетесь к удаленному компьютеру и все команды, которые Вы будете набирать в оболочке PowerShell, будут выполняться на удаленном компьютере так же, как если бы Вы набирали команды непосредственно на удаленном компьютере. Способ также обладает недостатком, так как сеанс ограничивается одним компьютером;
  • С помощью командлета Invoke-Command . С помощью данного способа можно выполнять команды или сценарии как на одном компьютере, так и на нескольких.

Например, чтобы подключиться к удаленному компьютеру (в примере ниже ServerName ) интерактивным сеансом выполните следующую команду:

Enter-PSSession ServerName

Сценарии, функции и модули в Windows PowerShell

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

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

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

Важно!

По умолчанию выполнение сценариев в Windows запрещено! Для того чтобы посмотреть политику выполнения сценариев выполните командлет Get-ExecutionPolicy . В результате он вернет действующую политику, например:

  • Restricted – блокируется выполнение любых сценариев (значение по умолчанию );
  • AllSigned – разрешено выполнение сценариев, которые имеют цифровую подпись;
  • RemoteSigned – разрешено выполнение локальных сценариев, все скачанные сценарии должны иметь цифровую подпись;
  • Unrestricted - разрешено выполнение любых сценариев (не рекомендуется, так как небезопасно! ).

Для разрешения выполнения сценариев необходимо использовать командлет Set-ExecutionPolicy с одним из вышеперечисленных параметров.

Например, для разрешения выполнения локальных сценариев выполним следующую команду, и согласимся с внесением изменений, нажав Y.

Set-ExecutionPolicy RemoteSigned

В сценарии можно передавать параметры, делать их обязательными или задавать значение по умолчанию.

В Windows PowerShell предусмотрен механизм создания собственных функций, которые также как и встроенные командлеты можно будет использовать в оболочке PowerShell.

Для этого необходимо указать ключевое слово Function и затем в фигурных скобках {} написать алгоритм работы этой функции, т.е. набор команд (например, какая-нибудь часто используемая процедура: создать пользователя с определенными правами, очистить определенные каталоги и так далее ). Потом необходимо сохранить все это в сценарий, но только уже с расширением.psm1, так как этот файл будет являться уже модулем.

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

Get-ChildItem Env:\PSModulePath | Format-Table -AutoSize

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

Интегрированная среда сценариев Windows PowerShell (ISE)

Для того чтобы было удобно писать сценарии, функции и соответственно модули, компания Microsoft разработала специальную графическую программу Integrated Scripting Environment (ISE) - интегрированная среда сценариев. Работать в этой программе очень удобно, к тому же она имеет мощный функционал (создание множества вкладок со сценариями, область вывода, встроенный отладчик и другое ).

Запустить ее можно следующим образом:

  • В Windows 7 - Пуск->Все программы ->Стандартные ->Windows PowerShell -> Windows PowerShell ISE;
  • В Windows 10 или Windows Server 2016 - Пуск->Все программы -> Каталог Windows PowerShell (в группе W ) -> Windows PowerShell ISE.

Примечание! ISE не будет работать на системе Windows Server, установленной в варианте Server Core.

Скриншот интегрированной среды сценариев PowerShell (ISE) в Windows Server 2016

На этом у меня все, надеюсь, материал был Вам полезен! Удачи!

Изучение PowerShell — книги и ресурсы

Данная статья открывает цикл записей, посвященных PowerShell . Да, пришло время командной строки!

Кратко — что такое PowerShell?

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

Почему PowerShell?

Стоит отметить два момента. В первую очередь — PowerShell действительно содержит язык сценариев; это очень компактный язык, в состав которого входит всего лишь порядка двух десятков ключевых слов. Но на самом деле PowerShell, как было сказано выше, - это оболочка командной строки, во многом сходная с cmd.exe или с оболочкой UNIX Bash.

Второй момент: Microsoft не поощряет практику использования оснащенных графическим интерфейсом консолей на серверах. Дело в том, что серверы могут обеспечивать эффективное функционирование графических интерфейсов лишь за счет ухудшения производительности сервера. Но использование графического интерфейса на клиентах, даже если эти клиенты подключены к серверу, вполне допускается и сегодня. Так в новых версиях Windows Server все функции доступны в первую очередь с помощью PowerShell и только потом (а некоторые и вовсе недоступны) с помощью графического интерфейса сервера.

Загрузить PowerShell можно с сайта TechNet — но в современных ОС MS Winodws он доступен «из коробки».

Для более легкого старта в изучении Windows PowerShell представляю вашему вниманию подборку различных материалов. Начнем список с видео курса из далекого 2009 года:

  • Пишем первый сценарий и знакомимся с Windows PowerShell

Интернет ресурсы:

  • Mastering PowerShell — powershell.com

Программы:

  • Script Browser для Windows PowerShell ISE . Данное дополнение позволяет с легкостью отыскивать необходимые скрипты в TechNet Script Center по заданным критериям и параметрам. По мимо этого содержит специальный модуль Script Analyzer, который после анализа предлагает улучшения/изменения, повышающие эффективность написанного скрипта. Этот модуль можно получить в комплекте Windows PowerShell ISE которая является частью OC Windows. Загвоздка в том, что Windows Server и PowerShell ISE требуют активации. Лицензия сама по себе платная, но не стоит отчаиваться. У Вас будет порядка 180 дней что бы испытать данный продукт.
  • Dell PowerGUI — Позволяет упростить сборку собственных сценариев PowerShell до простого выбора необходимых командлетов, которые подходят для Вашей задачи, и перетаскивания их в нужные места. Идеально подходит для тех, кто являются новичком в работе с PowerShell, но имеете базовое понимание концепций. PowerGUI - простой в использовании редактор, который, вероятно, усовершенствует Ваше понимание сборки более сложных и усовершенствованных сценариев, особенно если Вы лучше всего усваиваете информацию визуально.

Один из самых основных источников знаний — прекрасная справка программы:

Надеюсь данный список ресурсов поможет Вам в изучении PowerShell . Какие книги и наработки использовали вы? Оставьте ответ в комментариях и удачи в освоении новых знаний! 😉



Загрузка...