Глава 3. Применение системы подсказок

В Главе 1 мы упоминали, что возможность обнаружения - это ключевая функциональная возможность, упрощающая изучение и применение графических интерфейсов пользователя (GUI), а также что интерфейсы командной строки (CLI), такие как PowerShell, зачастую более сложны, поскольку в них отсутствуют такие функции обнаружения. На самом деле PowerShell обладает фантастическими возможностями обнаружения, но они не столь очевидны. Одной из основных функциональных возможностей обнаружения выступает справочная система (help system). В Главе 1 мы упоминали, что возможность обнаружения является ключевой функцией, которая упрощает изучение и применение графического интерфейса пользователя (GUI), и что интерфейсы командной строки (CLI), такие как PowerShell зачастую более сложны по причине отсутствия в них функциональности обнаружения. В действительности PowerShell обладает фантастическими возможностями обнаружения, но они не столь очевидны. Одной из основных функциональных возможностей обнаружения и выступает его система подсказок.

Система подсказок: как вы обнаруживаете команды

Потерпите немного пока мы взбираемся на импровизированную трибуну и прочтём вам проповедь. Все мы работаем в отрасли, которая не уделяет большого внимания чтению, хотя у нас и имеется аббревиатура, которую мы ловко сплавляем пользователям, когда желаем чтобы они прочли дружественное руководство - RTMF (read the friendly manual). Большинство администраторов сразу же погружается в работу, полагаясь на такие вещи, как всплывающие подсказки, контекстные меню и тому подобное - те средства обнаружения GUI - которые служат выяснению того как что- то делать. Именно так мы зачастую и работаем и полагаем, что вы делаете то же самое. Но давайте проясним один момент:

Если вы не желаете знакомиться с файлами справок PowerShell, вы не будете действенно работать с PowerShell. В не научитесь его применению, вы не обучитесь администрировать с его помощью другие службы, такие как Azure, AWS, Microsoft 365 и тому подобные; и вы также могли бы продолжать оставаться с GUI.

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

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

Если вы запускаете некую команду и получаете некую ошибку, именно ваша справочная система выступает тем, что покажет вам как надлежащим образом запускать эту команду с тем, чтобы не получать ошибок. Если вы желаете связать множество команд воедино для осуществления сложной задачи, именно справочная система это то, что поможет вам выявить как всякая команда способна подключаться к остальным. Вам нет нужды искать примеры в Google или Bing; вам надо изучить как применять сами команды с тем, чтобы вы могли создавать свои собственные примеры и решения.

Мы осознаём, что наша проповедь слегка тяжеловата, но 90% проблем, с которыми, как мы видим, пользователи борются на форумах, можно было бы решить, ели бы эти люди нашли несколько минут чтобы присесть, сделать несколько глубоких вдохов и ознакомиться со справкой. А затем прочтите данную главу, которая поможет вам понимать ту справку, с которой вы знакомитесь в PowerShell.

Начиная с денного момента мы рекомендуем вам знакомиться со справкой ещё по ряду причин:

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

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

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

Спускаемся с импровизированной трибуны.

[Замечание]Сопоставление команд и командлетов

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

Обновляемая подсказка

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

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


PS /User/travisp> help Get-Process
NAME
    Get-Process
SYNTAX
    Get-Process [[-Name] <string[]>] [-Module] [-FileVersionInfo]
    [<CommonParameters>]

    Get-Process [[-Name] <string[]>] -IncludeUserName [<CommonParameters>]

    Get-Process -Id <int[]> -IncludeUserName [<CommonParameters>]

    Get-Process -Id <int[]> [-Module] [-FileVersionInfo] [<CommonParameters>]

    Get-Process -InputObject <Process[]> [-Module] [-FileVersionInfo]
    [<CommonParameters>]

    Get-Process -InputObject <Process[]> -IncludeUserName 
  ➥ [<CommonParameters>]
 
ALIASES
    gps
 
REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It
    is displaying only partial help.
        -- To download and install Help files for the module that includes
    this cmdlet, use Update-Help.
        -- To view the Help topic for this cmdlet online, type: "Get-Help
    Get-Process -Online" or
           go to https://go.microsoft.com/fwlink/?LinkID=113324.
 	   
[Совет]Совет

Невозможно пропустить тот факт, что у вас локально не установлена подсказка. Когда вы впервые обратитесь за подсказкой, PowerShell предложит вам обновить содержимое вашей подсказки.

Обновление подсказки PowerShell должно стать вашей первой задачей. В Windows PowerShell для обновления от вас требовались полномочия "Администратора" или Суперпользователя ("root"). В PowerShell 6 и выше вы теперь способны выполнять обновление подсказки в качестве текущего пользователя. Откройте PowerShell и выполните Update-Help и, будьте любезны, подождать несколько минут.

[Совет]Совет

Когда вы не пользуетесь языком и региональными параметрами en-US, чтобы заставить работать Update-Help, вам может потребоваться определять -UICulture en-US.

Важно обладать привычкой обновления подсказок каждый месяц или около того. PowerShell способен даже загружать обновлённую подсказку для не принадлежащих Microsoft команд, при условии что модули таких команд расположены в надлежащем месте и чтобы они были закодированы так, чтобы содержать значение местоположения в Интернете для обновлений справки (модули это то, как добавляются в PowerShell команды и это поясняется в Главе 7).

У вас имеются компьютеры, которые не подключены к Интернету? Не проблема: проследуйте к тому, который имеет подключение и воспользуйтесь Save-Help для получения локальной копии вашей подсказки. Поместите её в файловый сервер или куда- то, что доступно для всей оставшейся вашей сетевой среды. Затем исполните Update-Help с его параметром -Source, указывая ей выгружать копию этой подсказки. Это позволит всем компьютерам из вашей сетевой среды схватывать эту обновлённую подсказку из такого центрального места, вместо того чтобы получать её из Интернета.

[Замечание]Подсказка обладает открытым исходным кодом

Файлы подсказки PowerShell Microsoft это материалы с открытым исходным кодом, которые доступны в https://github.com/MicrosoftDocs/PowerShell-Docs. Это может быть хорошим местом для просмотра самого последнего исходного кода, который ещё не был оттранслирован в файлы подсказки, которые способен выгружать и отображать PowerShell.

Запрос подсказок

PowerShell предоставляет командлет, Get-Help, который выполняет доступ к вашей системе подсказок. Вы можете наблюдать примеры (в особенности в Интернете), которые показывают как персонал применяет вместо этого ключевое слово Help. Ключевое слово Help вовсе не является естественным командлетом; это функция, которая выступает оболочкой вокруг центрального командлета Get-Help.

[Замечание]Подсказка в macOS/Linux

Имеющиеся файлы подсказки, при их просмотре в macOS и Linux применяют традиционную функциональную возможность man (manual) самой операционной системы, которая обычно "перенимает" этот экран для отображения данной подсказки, возвращая её в ваш обычный экран по завершению.

Help работает во многом аналогично своему базовому Get-Help, но он отправляет вывод Help в less, позволяя вам получать приемлемо поделённый на страницы представление вместо просмотра всей подсказки прокручиваемой за раз. Исполнение Help Get-Help и Get-Help Get-Content производят одинаковые результаты, однако последняя обладает отображение страницы за раз. Для воспроизводства такого разбиваемого на страницы отображения вы можете выполнить Get-Help Get-Content | less,однако это потребует дополнительного набора. Обычно мы применяем только Help, однако мы хотим чтобы вы понимали некий имеющийся под капотом трюк.

Между прочим, порой такое разбитое на страницы отображение может раздражать, потому как вы уже получили нужные вам сведения, но оно по- прежнему требует нажатие пробела для отображения остающихся сведений. Если вы столкнулись с этим, нажмите q для прекращения этой команды и возврата в приглашение на ввод оболочки. При применении less q всегда обозначает quit (выход).

Ваша система подсказок имеет две основные цели: помогать вам находить команды для выполнения конкретных задач и помогать вам изучать применение этих команд после того как вы её нашли.

Применение подсказок для нахождения команд

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

Как и большинство команд, Get-Help (а следовательно и Help)обладает некоторыми параметрами. Один из них - возможно, наиболее важный - это -Name. Данный параметр определяет название той темы подсказок, к которой вы бы желали получить доступ, причём это позиционный параметр, а потому вам не требуется набирать -Name; вы можете просто предоставлять то название, которое ищите. Он также принимает символы замены, что превращает вашу систему подсказок в полезную для обнаружения команд.

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


Help *event*
Help *object*
		

Первая команда вернёт в вашем компьютере перечень, подобный такому:


       Name                 Category ModuleName
 
       Get-Event            Cmdlet   Microsoft.PowerShell.Utility
       Get-EventSubscriber  Cmdlet   Microsoft.PowerShell.Utility
       New-Event            Cmdlet   Microsoft.PowerShell.Utility
       Register-EngineEvent Cmdlet   Microsoft.PowerShell.Utility
       Register-ObjectEvent Cmdlet   Microsoft.PowerShell.Utility
       Remove-Event         Cmdlet   Microsoft.PowerShell.Utility
       Unregister-Event     Cmdlet   Microsoft.PowerShell.Utility
       Wait-Event           Cmdlet   Microsoft.PowerShell.Utility
		
[Замечание]Замечание

После установки вами некоторых модулей из прочих источников, вы можете заметить, что перечень подсказок команд включает команды (и функции) из таких модулей как Az.EventGrid и Az.EventHub. Ваша система подсказок отображает их все, даже если вы ещё не загружали эти модули в память, что способствует вам выявлять команды из любых модулей, которые установлены в надлежащем местоположении, что мы обсудим в Главе 7.

Многие из имеющихся командлетов в нашем предыдущем перечне, кажется, должны делать нечто с событиями. В своей среде вы можете также обладать дополнительными командами, которые не относятся к делу, либо вы можете обладать темами "about", которые предоставляют базовые сведения (подробнее обсуждаемые в разделе 3.6). Когда вы пользуетесь системой подсказок для поиска команд PowerShell, старайтесь выполнять поиск при помощи максимально широкого термина из возможных - *object* или *event*, вместо *objectevent* - потому как вы получите максимально возможные результаты.

Когда у вас имеется некий командлет, который, как вы полагаете, выполнит необходимое задание (Register-ObjectEvent выглядит подходящим кандидатом на то, что нам требуется для нашего примера), вы можете обратиться за подсказкой по этой конкретной теме:


Help Register-ObjectEvent
		

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

[Совет]Попробуйте прямо сейчас

Наберите Help Register- и нажмите Tab. Это соответствует нескольким командам и не выполнит дополнение. В машинах Windows при повторном нажатии на Tab это продолжит прокрутку по всем доступным командам. В не- Windows машинах, когда вы нажимаете на Tab, вторая табуляция отобразит список из всех доступных команд.

При помощи Help вы можете применять и символы замещения - в основном символ подстановки *, который заменяет ноль или более символов. Если PowerShell находит лишь одно соответствие набранному вами, он не будет отображать список тем для такого единственного элемента. Вместо этого он сразу отобразит имеющееся содержимое для этого элемента.

[Совет]Попробуйте прямо сейчас

Выполните Help Get-EventS* и вы должны обнаружить содержимое файла подсказки для Get-EventSubscriber вместо списка соответствий темам подсказок.

Если вы следовали в своей оболочке инструкциям, теперь вы должны наблюдать файл подсказки для Get-EventSubscriber. Этот файл, носящий название сводной подсказки, предназначен для краткого описания своей команды и напоминания об её синтаксисе. Эти сведения полезны в том случае, когда вам необходимо быстро освежить в памяти применение команды, и именно с этого момента мы приступаем к интерпретации самого файла подсказки.

[Замечание]Дополнительно

Порой мы ходим делиться сведениями, которые хотя и достаточно примечательны, но не существенны для понимания вами самой оболочки. Мы помещаем такие сведения в сноску "Дополнительно", как эта. Если вы её пропустите, всё будет нормально, прочтя же её, зачастую вы ознакомитесь с альтернативным способом выполнения чего- либо или получите дополнительную информацию о PowerShell.

Мы упоминали, что наша команда Help не выполняет поиск командлетов; она осуществляет поиск тем подсказок. Поскольку всякий командлет обладает файлом подсказки, мы можем сказать что такой поиск выбирает некие результаты. Но мы также можем выполнить и непосредственный поиск для командлетов, воспользовавшись командлетом Get-Command (или его псевдонимом gcm).

Как и командлет Help, Get-Command принимает символы замены - а потому вы способны, например, исполнить gcm *get* для просмотра всех имеющихся команд, которые содержат в своём названии get. Хорошо это или плохо, но такой список будет включать не только командлеты, но и внешние команды, например, wget, которые могут оказаться бесполезными.

Лучше применять параметры -Noun или -Verb. По причине того, что названия команд будут ограничены лишь существительными или глаголами, получаемые результаты будут ограничены командлетами. Get-Command -Noun *event* вернёт перечень командлетов, имеющих отношение к событиям; Get-Command -Verb Get возвратит все командлеты, способные выполнять выборку чего- то. Вы также можете применять параметр -CommandType, определяя тип командлета: Get-Command *event* -Type cmdlet отобразит список всех командлетов, которые содержат в своих названиях event, причём данный перечень не будет содержать никакие внешние приложения или команды.

Интерпретация самой подсказки

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

Наборы параметров и общие параметры

Большинство команд может работать различными способами, причём в зависимости от того что вам требуется чтобы они выполняли. Например, вот имеющийся синтаксис для подсказки Get-Item:


SYNTAX
    Get-Item [-Stream <String[]>] [-Credential <PSCredential>] [-Exclude 
  ➥ <String[]>] [-Filter <String>] [-Force] [-Include
    <String[]>] -LiteralPath <String[]> [<CommonParameters>]
 
    Get-Item [-Path] <String[]> [-Stream <String[]>] [-Credential 
  ➥ <PSCredential>] [-Exclude <String[]>] [-Filter <String>] [-Force]
    [-Include <String[]>] [<CommonParameters>]
 	   

Обратите внимание на то, что данная команда в предыдущем синтаксисе перечисляется дважды, что указывает на то, что эта команда поддерживает два набора параметров; вы можете использовать эту команду двумя различными путями. Некоторые параметры совместно используются этими двумя наборами. Вы заметите, например, что оба набора параметров содержат параметр -Filter. Однако эти два набора параметров всегд обладают по крайней мере одним уникальным параметром, который присутствует только в этом наборе параметров. В данном случае наш первый набор параметров поддерживает -LiteralPath, который не входит в состав второго набора параметров; второй набор параметров содержит параметр -Path, который отсутствует в первом наборе, однако оба могут содержать и дополнительные не применяемые совместно параметры.

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

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

Вы заметите, что всякий набор параметров для каждого командлета PowerShell заканчивается []. Это ссылка на набор из 11 (на момент написания этих строк) параметров, которые доступны для каждого отдельного командлета, причём вне зависимости от того как вы применяете данный командлет. Мы обсудим некоторые из этих общих параметров позднее в данной книге, когда мы будем применять их для реальных задач. Позднее в данной главе, тем не менее, мы покажем где дополнительно ознакомиться с этими общими параметрами, если вам это интересно.

[Замечание]Замечание

Проницательные читатели уже распознали разновидности наших примеров. Читатели заметили иную схему подсказки Get-Item в зависимости от своей версии PowerShell. Возможно, вы также обнаружите ряд новых параметров. Но основы и понятия, которые мы поясняем не меняются. Не зацикливайтесь на том факте, что наблюдаемая вами подсказка может отличаться от той, которую мы показываем в данной книге.

Необязательные и обязательные параметры

Вам нет нужды во всех параметрах по- отдельности для запуска командлета. Подсказка PowerShell перечисляет необязательные параметры в квадратных скобках. Например, [-Credential <PSCredential>] указывает, что параметр -Credential необязательный. Вам вовсе не нужно пользоваться ими всеми; сам командлет, вероятно, предоставит значения по умолчанию для полномочий своего текущего пользователя если вы не определите при помощи данного параметра альтернативные полномочия. Именно поэтому [<-Common-Parameters>] заключён в квадратные скобки: вы можете выполнять данную команду не применяя никакие общие параметры.

Почти каждый командлет обладает по крайней мере одним необязательным параметром. Вы можете никогда не пользоваться этими параметрами и можете применять их ежедневно. Имейте в виду, что когда вы выбираете применение параметра, вам необходимо набрать лишь достаточную часть значения названия параметра с тем, чтобы PowerShell был способен однозначно определить какой именно параметр вы подразумеваете. Например, для -Force может оказаться недостаточным -F, потому как -F также может означать и -Filter. Однако -Fo будет допустимым сокращением для -Force, потому как больше нет параметров, начинающихся с -Fo.

Что произойдёт если вы попробуете запустить команду и забудете один из обязательных параметров? Взгляните на подсказку для Get-Item, например, и вы обнаружите, что параметр -Path обязательный. Вы можете заключить это по той причине, что весь параметр целиком - и его название, и его значение - не заключены в квадратные скобки. Это означает, что некий необязательный параметр можно определять по той причине, что сам параметр и его значение будут содержаться в квадратных скобках. Попробуйте запустить Get-Item не указав путь к файлу (Рисунок 3.1).

 

Рисунок 3-1


Данная подсказка Get-Item показывает, что значение переменной пути принимает некий массив строк, на что указывают квадратные скобки []

[Совет]Попробуйте прямо сейчас

Выполните это пример, запустив Get-Item без каких бы то ни было параметров.

PowerShell также должен выдать приглашение на ввод для значения обязательного параметра -Path. Если вы наберёте нечто вроде ~ или ./ и нажмёте Enter, ваша команды выполнится верно. Чтобы прервать свою команду вы можете нажать Ctrl-C.

Позиционные параметры

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

 

Поиск позиционных параметров в сводках синтаксиса

Первый способ вы обнаружите в соответствующей сводке синтаксиса: значение названия параметра - только самого названия - будет взято в квадратные скобки. Например, взгляните на первые два параметра во втором наборе параметров Get-Item:


[-Path] <String[]> [-Stream <String[]>]…[-Filter <String>]
 	   

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

Наш второй параметр, -Stream, не обязателен; и сам он, и его значение заключены в квадратные скобки. Внутри них, -Stream сам по себе не содержится во втором наборе квадратных скобок, что указывает на то, что это не позиционный параметр. Если бы он являлся позиционным параметром, он бы выглядел как [[-Stream] <string[]>]. Следовательно, для предоставления его значения, вам необходимо указывать название данного параметра.

Наш параметр -Filter (который приводится далее в этом синтаксисе; запустите Help Get-Item и обнаружьте его самостоятельно) не обязателен, потому как он целиком содержится внутри квадратных скобок. Значение названия -Filter заключено в квадратные скобки, что сообщает вам что если вы решите воспользоваться данным параметром, вам придётся набирать значение названия этого параметра (или по крайней мере его часть). Существует ряд уловок по применению позиционных параметров:

  • Совершенно нормально смешивать и ставить в соответствие позиционные параметры с теми, которым необходимы их названия. Позиционные параметры всегда обязаны быть на верных местах. Например, Get-Item ~ -Filter * допустимо: ~ заполнит значение параметра -Path, поскольку данное значение расположено самой первой позицией, а * проследует в параметр -Filter, потому как было применено его название.

  • Всегда допустимо применять названия параметров, а когда вы поступаете так, значение порядка, в котором вы набираете их, не существенно. Get-Item -Filter * -Pa * допустимо, потому как мы воспользовались названиями параметров (в данном случае -Path сокращено).

    [Замечание]Замечание

    Некоторые команды, например, Get-Item, обладают множеством позиционных параметров. Самым первым выступает -Path, за ним следует -Filter. Когда вы пользуетесь множеством позиционных параметров, не теряйте отслеживание их положений. Get-ChildItem ~ Down* сработает, при том что ~ подключается к -Path, а Down* присоединяется к -Filter. Get-ChildItem ~ Down* ~ не получит ничего вовсе, ибо ~ присоединится к -Filter и, скорее всего, не будет соответствовать никаким элементам.

Мы дадим вам практический совет: Пользуйтесь названиями параметров пока вам это комфортно для конкретных командлетов и пробуйте набирать часто применяемые названия параметров снова и снова. После этого пользуйтесь позиционными параметрами для экономии своего набора. Когда приходит время вставлять команду в некий текстовый файл для более быстрого повторного применения, всегда пользуйтесь полным названием командлета и набирайте полное название параметра - никаких позиционных параметров и никаких сокращений названий параметров. Поступая так вы превращаете файл в более просто читаемый и понимаемый в будущем, а поскольку вам не приходится набирать повторно названия параметров (это обусловлено тем, что вы уже вставили свою команду в файл), вам не придётся проводить дополнительную работу по набору.

 

Поиск позиционных параметров во всей подсказке

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

[Совет]Попробуйте прямо сейчас

Выполните Help Get-Item -Full. Не забывайте пользоваться клавишей пробела для просмотра всего файла по странице за раз и нажимать Ctrl-C если вы желаете прекратить просмотр данного файла не достигая конца. Теперь, пройдитесь постранично по всему этому файлу, что позволит вам прокрутить его обратно и просмотреть его весь. Кроме того, вместо параметра -Full попробуйте воспользоваться параметром -Online, что должно сработать в любом компьютере или сервере клиента с браузером. Имейте в виду, что успех применения -Online зависит от качества лежащего в основе файла подсказки. Если этот файл имеет неверный формат, вы можете увидеть не всё.

Пролистайте страницы вниз пока не дойдёте до описания параметра -Path. Он должен выглядеть как-то похоже на то, что отображено на Рисунке 3-2.

 

Рисунок 3-2


Сегмент подсказки Get-Item отображающий, что значение переменной -path необходимо

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

Мы всегда поощряем студентов сосредотачиваться на чтении полной подсказки, когда они приступают к командлетам, вместо того чтобы пользоваться лишь сокращённым напоминанием синтаксиса. Чтение такой подсказки выявляет дополнительные подробности, включая такие описания применения параметра. Вы также можете видеть, что эти параметры принимают символы замены, что означает что вы можете предоставлять значения как Down*. Вам не требуется набирать значение название элемента, например значение папки Downloads.

Значения параметров

Имеющиеся файлы подсказок также предоставляют вам ключи относительно того, какой вид ввода принимает каждый из параметров. Большинство параметров ожидают некий вид значений ввода, которые всегда будут следовать за названием параметра и будут отделяться от значения названия параметра пробелом (а не двоеточием, знаком равенства или иным прочим символом, хотя время от времени вы можете сталкиваться с исключениями). В сокращённом синтаксисе значение типа ожидаемого ввода отображается угловыми скобками как <>:


-Filter <String>
 	   

Это отображается аналогичным образом и в полном синтаксисе:


    -Filter <String>
        Specifies a filter in the format or language of the provider. 
        The value of this parameter qualifies the Path parameter.
 
        The syntax of the filter, including the use of wildcard characters, 
        depends on the provider. Filters are more efficient than
        other parameters, because the provider applies them when the cmdlet 
        gets the objects rather than having PowerShell filter
        the objects after they are retrieved.
 
        Required?                    false
        Position?                    named
        Default value                None
        Accept pipeline input?       False
        Accept wildcard characters?  true
 	   

Давайте рассмотрим некоторые распространённые типы ввода:

  • String - Последовательность букв или цифр. Порой может содержать пробелы, однако при их наличии, вся такая строка целиком обязана содержаться в кавычках. Например, /usr/bin не должна заключаться в кавычки, а ~/book samples обязана, потому как она обладает пробелом в середине. На данный момент вы можете взаимозаменяемо пользоваться одинарными или двойными кавычками, однако лучше привыкать к одинарным.

  • Int, Int32 или Int64 - Целое число (полное число без десятичной части).

  • DateTime - Обычно некая строка, которая может интерпретироваться как дата на основе региональных установок вашего компьютера. В Соединённых Штатах это обычно нечто вроде 10-10-2020 с месяцем, днём и годом. {Прим. пер.: В РФ - 28.10.2020 (день, месяц, год).}.

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


-Path <String[]>
 	   

Такие идущие одна за другой квадратные скобки после String не указывают на нечто не обязательное. Вместо этого, String[] указывает, что данный параметр способен принимать массив, набор, либо список строк. В таких лучаях он всегда допустим для предоставления отдельного значения:


Get-Item -Path ~
 	   

Однако он также допустим и для задания множества значений. Простейшим способом является предоставление разделённого запятыми списка. PowerShell воспринимает разделённые запятыми списки как массив значений:


Get-Item -Path ~, ~/Downloads
 	   

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


Get-Item -Path '~', '~/Downloads'
 	   

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


Get-Item -Path '~, ~/Downloads'
 	   

В данном случае ваш командлет будет искать файл с названием ~, ~/Downloads, что скорее всего вовсе не то что бы вы хотели.

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

Иной способ, коим вы можете определять множество значений для параметра (допустим, это обязательный параметр), состоит в том что вы не определяете такой параметр вовсе. Как это имеет место для обязательного параметра, PowerShell выдаст вам приглашение на ввод необходимого значения параметра. Для параметров, которые принимают множество значений, вы можете набрать соответствующее первое значение и нажать Enter. PowerShell затем выдаст приглашение на ввод второго значения, который вы можете набрать и закончить нажатием Enter. Продолжайте выполнять это пока не закончите и нажмите Enter в пустом приглашении на ввод, чтобы позволить PowerShell понять что вы закончили. Как и всегда, вы можете нажать Ctrl-C для прерывания своей команды если вы не хотите получать приглашения на ввод.

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


[-Force]
 	   

Для полного синтаксиса они выглядят так:


    -Force [<SwitchParameter>]
        Indicates that this cmdlet gets items that cannot otherwise be accessed, 
        such as hidden items. Implementation varies from
        provider to provider. For more information, see about_Providers 
        (../Microsoft.PowerShell.Core/About/about_Providers.md).
        Even using the Force parameter, the cmdlet cannot override security restrictions.
 
        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       False
        Accept wildcard characters?  false
 	   

Значение части [<SwitchParameter>] подтверждает что это переключатель и что он не ожидает некого входного значения. Переключатели никогда не бывают позиционными; вам всегда необходимо набирать значение название параметра (или по крайней мере его сокращённую версию). Переключатели всегда необязательны, что предоставляет вам возможность пользоваться ими, либо нет.

Например, Get-Item .* никогда не отобразит для вас никаких файлов, но Get-Item .* -Force снабдит вас списком файлов, начинающихся с ., поскольку начинающиеся с . файлы рассматриваются как скрытые, а -Force сообщает вашей команде включать и скрытые файлы.

Поиск примеров команд

Мы склонны учиться на примерах, поэтому мы постараемся втиснуть в данную книгу как можно больше примеров. Разработчики PowerShell знают, что большинству администраторов нравятся примеры, поэтому многие из них встроены в файлы подсказок. Если вы прокрутили файл справки Get-Item до самого конца, вы, скорее всего, заметили почти дюжину образцов того как применять данный командлет.

Давайте рассмотрим более простой способ добраться до таких примеров, если это всё что вы желаете обнаружить. Воспользуйтесь параметром -Example для команды Help вместо -Full:


Help Get-Item -Example
		
[Совет]Попробуйте прямо сейчас

Проследуйте вперёд и откройте примеры командлета, воспользовавшись этим новым параметром.

[Замечание]Замечание

Поскольку PowerShell возник в Windows, многие примеры пользуются путями Windows. Предполагается, что вы знаете, что способны применять пути macOS или Linux. На самом деле, для PowerShell всё равно применяете ли вы в качестве разделителя каталогов / или \ в любой из платформ.

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

Доступ к темам "about"

Ранее в этой главе мы упоминали что система подсказок PowerShell содержит темы основ помимо подсказок для конкретных командлетов. Такие базовые вопросы часто носят название тем "about", поскольку их названия файлов начинаются с about_. Из обсуждавшегося ранее в этой главе вы также можете вспомнить что все командлеты поддерживают некий набор общих параметров. Как вы полагаете, где вы можете ознакомиться дополнительно с этими общими параметрами?

[Совет]Попробуйте прямо сейчас

Прежде чем читать далее, посмотрите можете ли вы перечислить такие общие параметры при помощи своей системы подсказок.

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


Help *common*
		

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


-Verbose
-Debug
-WarningAction
-WarningVariable
-ErrorAction
-ErrorVariable
-OutVariable
-OutBuffer
-InformationAction
-InformationVariable
-PipelineVaribale
 	   

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

[Совет]Попробуйте прямо сейчас

Выполните команду get-help about_* и взгляните на все темы about. Теперь исполните get-help about_Updateable_Help.

Интернет доступ к подсказке

Файлы подсказок PowerShell писали простые смертные, что означает, что они не свободны от ошибок. В дополнение к обновлению файлов подсказок (что вы можете осуществить исполнив Update-Help), Microsoft публикует подсказки на своём вебсайте. Параметр -Online команды подсказки PowerShell попробует открыть подсказку на веб основе - даже в macOS или Linux! - для конкретной команды:


Help Get-Item -Online
		

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

Мы влюблены в Интернет подсказку, поскольку она позволяет нам читать весь текст в одном окне (своего веб браузера, в котором эта подсказка к тому же отлично форматирована) по мере того как мы выполняем набор в PowerShell.

Нам важно указать вам на то, что команда PowerShell в Microsoft открыла исходный код для всех своих файлов подсказок с апреля 2016 года. Любой способе добавлять примеры, исправлять ошибки и в целом способствовать улучшению этих файлов подсказок. В Интернете, проект с открытым исходным кодом расположен в https://github.com/MicrosoftDocs/Powershell-Docs и обычно содержит лишь ту документацию, которой владеет сама команда PowerShell; они не обязательно содержат документацию от прочих команд, которые производят команды PowerShell. Вы можете править эти команды напрямую в их документации с открытом исходным кодом!

Лабораторные занятия

[Замечание]Замечание

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

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

  1. Запустите Update-Help и убедитесь что она выполнена без ошибок с тем, чтобы вы обладали копией необходимых подсказок в своём локальном компьютере. Вам потребуется интернет- подключение.

  2. Можете ли вы найти какой бы то ни было командлет, способный преобразовывать вывод прочих командлетов в HTML?

  3. Существуют ли командлеты, способные перенаправлять вывод в некий file?

  4. Сколько командлетов способно работать с processes (процессами)? (Совет: вспомните как все командлеты пользуются отдельным существительным.)

  5. Какие командлеты вы можете применять для set (настройки) точки прерывания PowerShell. (Совет: относящиеся к PowerShell существительные часто имеют префикс PS.)

  6. Вы изучили, что псевдонимы выступают краткими названиями для командлетов. Какие командлеты доступны для создания, изменения, экспорта или импорта aliases (псевдонимов)?

  7. Существует ли способ transcript (дублирования) всего что вы набираете в своей оболочке и сохранения такого дубликата в неком текстовом файле?

  8. Получение всех процессов может стать ошеломительным. Как вы можете получать процессы по значению названия соответствующего процесса?

  9. Существует ли способ запросить Get-Process сообщать вам того пользователя, который запускал этот процесс?

  10. Существует ли способ запуска command в удалённом хосте? (Совет: глаголом для запуска чего- то в данном случае выступает Invoke.)

  11. Испробуйте файл подсказки для командлета Out-File. Сколько символов в ширину имеют создаваемые по умолчанию этим командлетом файлы? Имеется ли параметр, который позволял бы вам изменять такую ширину?

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

  13. Как вы можете обнаружить список всех определённых в PowerShell aliases (псевдонимов)?

  14. Применяя как псевдоним, так и сокращённые названия параметров, какой будет самая короткая командная строка, которую вы бы могли набрать для выборки списка commands со словом process в их названии?

  15. Сколько способных иметь дело с общими объектами командлетов доступно? (Совет: не забудьте применять существительное в единственном числе object вместо его же во множественном - objects.)

  16. Данная глава вкратце упоминала arrays (массивы). Какая из тем могла бы сообщить вам дополнительно о них?

Ответы лабораторных занятий

  1. Update-Help

    Либо, когда вы запускаете это более раза за день, пользуйтесь следующим:

    Update-Help –force

  2. help html

    Или вы можете попробовать Get-Command:

    Get-Command –Noun html

  3. Get-Command -Noun file,printer

  4. Get-Command –Noun process

    или

    Help *Process

  5. Get-Command -Verb set -Noun psbreakpoint

    Либо когда вы не уверены в существительном, пользуйтесь символом замены:

    help *breakpoint

    или

    help *break*

  6. help *alias

    или

    Get-Command –Noun alias

  7. help transcript

  8. help Get-Process –Parameter Name

  9. help Get-Process –Parameter IncludeUserName

  10. Команда для выполнения поверх SSH:

    help Invoke-Command –Parameter hostname

    Или команда для запуска под наследуемым протоколом Windows

    help Invoke-Command –Parameter computername

  11. Help Out-File –Full

    или

    Help Out-File –Parameter Width

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

  12. Если вы запустите Help Out-File –Full и взглянете на параметры, вы должны обнаружить -NoClobber.

  13. Get-Alias

  14. Gcm -na *process*

  15. Get-Command –Noun object

  16. help about_arrays

    Либо вы можете воспользоваться символами замены:

    help *array*