Go pro: руководство по PowerShell для опытных пользователей

Если вы боролись с Windows 10, вы, несомненно, слышали о PowerShell. Если вы недавно пытались сделать что-то необычное с Win7 / 8.1, возможно, вам подойдет и PowerShell. После многих лет использования командной строки Windows и смешанных пакетных файлов пришло время обратить ваше внимание на что-то более мощное, более адаптивное - лучшее.

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

Расслабьтесь. PowerShell - это мощный инструмент, но он не должен пугать.

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

Шаг 1. Заверните

Первое, что вам понадобится, это сама PowerShell. Если вы используете Windows 10, у вас уже установлена ​​последняя версия PowerShell 5. (В Win10 Anniversary Update есть версия 5.1, но вы не заметите разницы с версией 5.0 в Fall Update.) Windows 8 и 8.1 поставляются с PowerShell 4, которого достаточно для того, чтобы вам немного помочить. Установить PowerShell в Windows 7 несложно, но это требует особой осторожности - и вам нужно установить .Net Framework отдельно. ХуанПабло Джофре подробно описывает, как установить WMF 5.0 (Windows Management Framework), который включает PowerShell, в дополнение к инструментам, которые вы вряд ли будете использовать при запуске, на MSDN.

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

Чтобы запустить PowerShell от имени администратора из Windows 10, нажмите Пуск и прокрутите список приложений до Windows PowerShell. Щелкните эту строку, щелкните правой кнопкой мыши Windows PowerShell и выберите «Запуск от имени администратора». В Windows 8.1 найдите Windows PowerShell в системной папке Windows. В Win7 он находится в папке Accessories. Вы можете запустить PowerShell как «обычный» пользователь, выполнив ту же последовательность действий, но щелкнув левой кнопкой мыши.

В любой версии Windows вы можете использовать поиск Windows для поиска PowerShell. В Windows 8.1 и Windows 10 вы можете поместить его в меню «Питание» Ctrl-X (щелкните правой кнопкой мыши пустое место на панели задач и выберите «Свойства»; на вкладке «Навигация» установите флажок «Заменить командную строку»). После того, как вы его откроете, рекомендуется закрепить PowerShell на панели задач. Да, вам это очень понравится.

Шаг 2. Введите старомодные команды Windows

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

Например, cdизменяет каталоги (также известные как папки) и по- dirпрежнему перечисляет все файлы и папки, включенные в текущую папку.

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

Шаг 3. Установите файлы справки

Команды , как cdи dirне являются носителями команд PowerShell. Это псевдонимы - заменители настоящих команд PowerShell. Псевдонимы могут быть удобны для тех из нас, у кого память пальцев трудно преодолеть. Но они даже не касаются наиболее важных частей PowerShell.

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

Справка PowerShell сообщает мне, что dirэто псевдоним для команды PowerShell Get-ChildItem. Конечно, если вы введете get-childitemв командной PS C:\>строке, вы увидите именно то, что видели с помощью dirкоманды.

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

С этого момента введите, get-helpа затем введите команду («cmdlet» в PowerShell Speak, произносится «command-let»), которая вас интересует, и просмотрите всю справку по этому элементу. Например, get-help get-childitemвыводит сводку get-childitemопций. Он также предлагает вам ввести вариации на тему. Таким образом, следующее:

get-help get-childitem -examples

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

get-help get-childitem -detailed

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

Шаг 4. Получите справку по параметрам

В help dirскриншоте, вы могли заметить , существует два листинга под SYNTAXдля get-childitem. Тот факт, что существует два разных синтаксиса для командлета, означает, что есть два способа запуска командлета. Как разделить синтаксисы и что означают параметры? Ответ прост, если знать трюк.

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

get-help get-childitem -full

В результате создается построчный список того, что вы можете делать с помощью командлета и что может (а может и не произойти!). Смотрите скриншот.

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

get-childItem “*.txt” -recurse

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

get-childitem “HKLM:\Software”

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

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

Шаг 5: выберите имена

Там причина , почему командлеты мы видели до сих пор выглядят одинаково: get-childitem, update-helpи get-helpвсе следуют той же глагол-существительное конвенции. К счастью, все командлеты PowerShell используют это соглашение с глаголом перед существительным (в единственном числе). Те из вас, кто неделями боролся с непоследовательно названными командами VB и VBA, могут вздохнуть с облегчением.

Чтобы понять, к чему мы стремимся, взгляните на некоторые из наиболее распространенных командлетов (спасибо блогу Эда Уилсона «Эй, сценарист!»). Начните с командлетов, которые проникают в вашу систему и извлекают полезную информацию, например следующую:

  • set-location: Устанавливает текущее рабочее место в указанное место
  • get-content: Получает содержимое файла
  • get-item: Получает файлы и папки
  • copy-item: Копирует элемент из одного места в другое.
  • remove-item: Удаляет файлы и папки
  • get-process: Получает процессы, запущенные на локальном или удаленном компьютере.
  • get-service: Запускает службы на локальном или удаленном компьютере.
  • invoke-webrequest: Получает контент с веб-страницы в Интернете.

Чтобы увидеть, как работает конкретный командлет, используйте get-help, как в

get-help copy-item -full

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

copy-item c:\users\[username] \documents\* c:\temp

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

Попробуйте этот командлет. (Он может попытаться заставить вас установить программу, чтобы прочитать поле «О программе». Если да, не обращайте на это внимания.)

invoke-webrequest askwoody.com

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

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

  • get-command: Список всех доступных командлетов (это длинный список!)
  • get-verb: Список всех доступных глаголов (левые половины командлетов)
  • clear-host: Очищает отображение в основной программе.

Различные параметры (помните, get-help) позволяют сократить количество команд и ограничиться параметрами, которые могут быть вам полезны. Например, чтобы увидеть список всех командлетов, которые работают со службами Windows, попробуйте следующее:

get-command *-service

В нем перечислены все глаголы, которые используются serviceв качестве существительного. Вот результат:

Get-Service

New-Service

Restart-Service

Resume-Service

Set-Service

Start-Service

Stop-Service

Suspend-Service

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

Шаг 6: Принесите трубы

Если вы когда-либо использовали командную строку Windows или работали с пакетным файлом, вы знаете о перенаправлении и каналах. Проще говоря, и перенаправление (  >персонаж), и каналы ( |символ) берут результат действия и прикрепляют его в другом месте. Вы можете, например, перенаправить вывод dirкоманды в текстовый файл или «перенаправить» результат pingкоманды в a 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 имеет возможность конвейера, но не ограничивается текстом. Вместо этого PowerShell позволяет передавать весь объект от одного командлета к другому, где «объект» - это комбинация данных (называемых свойствами) и действий (методов), которые могут использоваться с данными.

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

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

get-process | get-member

Выполнение этой команды создает длинный список свойств и методов для get-process, но в самом начале списка вы можете увидеть тип создаваемого объекта get-process :

TypeName: System.Diagnostics.Process

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

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

get-command -Parametertype System.Diagnostics.Process

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

Некоторые командлеты печально известны тем, что принимают практически любой ввод. Главный из них: where-object. Это может сбивать с толку where-objectкаждый элемент, отправленный по конвейеру, один за другим и применяет любые критерии выбора, которые вы запрашиваете. Есть специальный маркер под названием $_. это позволяет вам проходить по каждому элементу в конвейере по одному.

Допустим, вы хотите составить список всех процессов, запущенных на вашем компьютере, которые называются « svchost» - на языке PowerShell вы хотите сопоставить Nameсвойство  svchost. Попробуйте эту команду PowerShell:

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

В where-objectКомандлете смотрит на каждый System.Diagnostics.Processэлементе, сравнивает .Nameэтот элемент с « svchost»; если элемент совпадает, он выплевывается концом трубы и печатается на вашем мониторе. Смотрите скриншот.