Чтобы получить доступ к папкам и файлам в среде Windows PowerShell, необходимо указывать путь к нужному ресурсу, например C:WindowsSystem32. В данном случае путь начинается с буквы C, означающей имя накопителя. Всякий раз, когда пользователь обращается к ресурсу файловой системы, он должен указывать имя накопителя — если, конечно, накопитель не указан неявным образом в контексте команды (скажем, когда пользователь получает список объектов текущего рабочего каталога).
Накопители файловой системы — не единственный тип накопителей, поддерживаемый оболочкой PowerShell. Она поддерживает целый ряд накопителей, которые предоставляют доступ к различным хранилищам данных. Например, как было показано в предыдущей статье серии, для доступа к встроенным переменным используется накопитель Variable, а для доступа к переменным среды — накопитель Env.
На шестом уроке — последнем в серии PowerShell 101 — речь пойдет о том, какие накопители доступны в рассматриваемой среде и как реализовывать их с помощью провайдеров PowerShell, которые облегчают доступ к хранилищам данных. Кроме того, я расскажу о том, как работать со встроенными накопителями PowerShell и как создавать дополнительные накопители. Мы рассмотрим, как обращаться не только к хранилищам файловой системы, но и к хранилищам сертификатов, к реестру и к другим хранилищам данных.
Основные сведения о провайдерах PowerShell
Основными компонентами доступа к хранилищам данных являются провайдеры PowerShell. Провайдер — это программа Microsoft.NET, обеспечивающая доступ к данным и связывающая среду PowerShell и данные. Провайдеры абстрагируют доступ к данным, так что пользователь может внутри PowerShell применять одни и те же механизмы для взаимодействия с различными хранилищами. Например, с помощью команды Get-ChildItem можно обращаться к файловой системе, реестру и хранилищу сертификатов. PowerShell поддерживает целый ряд встроенных провайдеров. Чтобы просмотреть список провайдеров, имеющихся в системе в данный момент, можно воспользоваться командой Get-PSProvider в команде
Get-PSProvider | select Name
В таблице приведен перечень провайдеров, входящих сегодня в комплект поставки PowerShell. Поскольку среда PowerShell является расширяемой, допускается создание пользовательских провайдеров для обращения к хранилищам данных других типов. Затем новые провайдеры устанавливаются в системе, и пользователи могут обращаться к хранилищам данных точно так же, как они обращаются к хранилищам, поддерживаемым встроенными провайдерами. Впрочем, изложение материала о пользовательских провайдерах выходит за рамки статьи. Дополнительные сведения можно найти в справочном файле about_provider.
Провайдеры играют важную роль, но пользователи, работающие в среде PowerShell, как правило, их не замечают. Зато им видны накопители PowerShell, с помощью которых осуществляется доступ к провайдерам.
Работа со встроенными накопителями
Провайдеры предоставляют данные через один или несколько накопителей PowerShell. К примеру, провайдер FileSystem предоставляет данные файловой системы через накопители PowerShell, которые соответствуют накопителям Windows. Так, провайдер предоставляет доступ к накопителю С системы Windows через накопитель C оболочки PowerShell.
Чтобы просмотреть список накопителей PowerShell и связанных с ними провайдеров, можно воспользоваться командой Get-PSDrive, как показано в примере:
Get-PSDrive | sort Provider, Name
Эта команда осуществляет сортировку результатов сначала по провайдеру, а затем по имени. В итоге, как показано на экране 1, провайдеры объединяются в группы. Обратите внимание, что на моей системе провайдер FileSystem взаимодействует с шестью накопителями, провайдер Registry — с двумя, а каждый из оставшихся провайдеров — только с одним накопителем.
Кроме того, приведенная выше инструкция отображает сведения о корневом каталоге. Корневым называется каталог внутри целевого хранилища данных, который соответствует накопителю PowerShell. Так, накопитель HKCU соответствует разделу HKEY_ CURRENT_USER реестра. Для накопителей, которые представляют не имеющие иерархической структуры хранилища данных, такие как псевдонимы и переменные PowerShell, значение корневого каталога остается пустым. С помощью команды Get-PSDrive можно получать информацию о том или ином накопителе. Так, следующая инструкция позволяет получить данные о накопителе Function:
Get-PSDrive Function | Format-List
Как видно на экране 2, данная инструкция возвращает такие детали, как имя провайдера и описание накопителя. Обратите внимание, что на этом экране представлена также инструкция
Get-PSDrive -PSProvider Registry
В данном случае Get-PSDrive возвращает список накопителей, связанных с провайдером Registry. Получив информацию о доступных накопителях, мы можем обращаться к этим накопителям с помощью команд. Так, выполнив инструкцию
cd Env:
мы можем сделать рабочим каталогом накопитель Env.
В данной инструкции псевдоним cd используется для обращения к команде Set-Location. На экране 3 показано, как этот новый каталог отображается в окне командной строки. Перейдя в эту папку, мы можем выполнять и другие команды PowerShell, например
dir | where {$_.Name -like «*path*»}
В этой команде я использую псевдоним dir для обращения к команде Get-ChildItem. Затем команда отфильтровывает все имена переменных, не содержащие строки path. Результаты ее выполнения представлены на экране 3. Они показывают, что команда Get-ChildItem действует так же, как если бы мы имели дело с накопителем файловой системы.
Пользователь может обращаться к накопителю любого типа из накопителя любого другого типа. Следующая инструкция получает список объектов накопителя HKCU:
dir HKCU:
На экране 4 видно, что моим рабочим каталогом по-прежнему является Env, однако результаты считываются в накопителе HKCU.
Кроме того, пользователь может переходить из накопителя одного типа в накопитель любого другого типа. Следующая команда превращает в рабочий каталог раздел реестра:
cd HKCU:SoftwareMicrosoftOffice
Как мы видим, пользователь может обратиться не только к другому накопителю, но и к папкам, размещенным внутри этого накопителя, будь то реестр, файловая система или другое хранилище данных с иерархической структурой. В рассматриваемом случае я сделал рабочим каталог HKEY_CURRENT_USERSoftwareMicrosoftOffice.
Кроме того, неважно, через какого провайдера пользователь обращается к данным — через того же провайдера или через других провайдеров. Так, следующая инструкция считывает информацию из раздела реестра в другом кусте:
dir HKLM:SoftwareMicrosoftOffice
С помощью накопителей PowerShell мы можем перемещаться из одного каталога в другой, не предпринимая для этого каких-либо специальных шагов, как показано на экране 5.
Для просмотра конкретных сведений, касающихся того или иного элемента, например раздела реестра, можно использовать команду Get-ItemProperty. Следующая инструкция считывает информацию о разделе реестра HKEY_LOCAL_MACHINESoftwareMicrosoftASP.
NET key:
Get-ItemProperty `
HKLM:SoftwareMicrosoftASP. NET
Как показано на экране 6, при выполнении инструкции возвращается перечень свойств и их значений. Обратите внимание, что в число результатов включаются такие специфичные для PowerShell данные, как имя накопителя PowerShell и имя провайдера.
Итак, встроенные накопители PowerShell используются для получения данных. Но, кроме этого, с их помощью можно выполнять любые действия, применимые к соответствующему хранилищу данных. Так, команду New-Item можно использовать для создания объекта внутри реестра:
New-Item `
HKLM:SoftwareMicrosoftTestKey1
Эта команда создает раздел TestKey1 в разделе HKEY_LOCAL_MACHINESoftwareMicrosoft. Результаты выполнения команды показаны на экране 7.
После создания раздела команду New-ItemProperty можно использовать для добавления свойств в этот раздел. Процедура добавления свойства в PowerShell аналогична добавлению записи в редакторе реестра. Следующая инструкция добавляет в раздел TestKey1 свойство TestProperty:
New-ItemProperty `
HKLM:SoftwareMicrosoftTestKey1 `
– Name TestProperty -PropertyType string `
– Value «test value»
Добавленное свойство имеет значение test value, с типом данных «строка». При выполнении этой инструкции PowerShell возвращает список всех свойств и их значений. Как показывает экран 7, было добавлено новое свойство.
С помощью накопителей PowerShell можно выполнять и другие действия. Так, следующая команда использует команду Rename-Item, с тем чтобы присвоить разделу TestKey1 новое имя TestKey2:
Rename-Item `
HKLM:SoftwareMicrosoftTestKey1 `
TestKey2
В этой команде первый аргумент идентифицирует исходный раздел, а второй аргумент содержит новое имя. Еще можно удалить раздел реестра с помощью команды Remove-Item:
Remove-Item `
HKLM:SoftwareMicrosoftTestKey2
Таким образом, работа с накопителем реестра аналогична работе с накопителем файловой системы. Кстати говоря, команды New-Item, Rename-Item и Remove-Item можно с такой же легкостью применять к файлам и папкам — или элементам — любого другого накопителя.
Создание накопителей PowerShell
Пока что мы ограничивались использованием встроенных накопителей PowerShell. Однако эта среда позволяет создавать накопители на основе существующих провайдеров. Такая возможность может оказаться полезной для тех, кто хочет упростить часто используемые команды.
Накопители PowerShell создаются с помощью команды New-PSDrive. В следующем примере эта команда создает накопитель с именем ps:
New-PSDrive -Name ps `
– PSProvider FileSystem -Root $pshome
Инструкция указывает имя нового накопителя, провайдера и, наконец, — корневой каталог. В данном случае я использую встроенную переменную PSHOME для получения имени главной папки PowerShell. При выполнении данной инструкции PowerShell создает накопитель и отображает сведения о нем, как показано на экране 8. Обратите внимание на то, что PowerShell отображает фактическое имя корневого каталога, а не имя переменной. Более подробные сведения о переменных были приведены в уроке 5.
Создав новый накопитель, вы можете использовать его точно так же, как встроенные накопители. Например, следующая инструкция делает рабочим каталогом накопитель ps:
cd ps:
Как показано на экране 8, в приглашении на ввод команды PowerShell отображается имя нового накопителя. Теперь в нем можно работать, как если бы мы сделали рабочим каталог C:Windowssystem32Windows PowerShellv1.0.
Если необходимо убедиться, что вы работаете в той папке, которая вам нужна, можете запустить команду Get-ChildItem. На экране 9 показано, каких результатов следует ожидать после ее выполнения. Обратите внимание, что в числе прочих данных на экране отображается корректное имя рабочего каталога. В рассматриваемом примере PowerShell выполняется на компьютере Windows XP. Если у вас PowerShell функционирует в другой операционной среде, результаты могут быть иными, поскольку в различных операционных системах для PowerShell указываются разные главные каталоги.
Среди прочих команд в PowerShell реализована команда Remove-PSDrive, позволяющая удалять пользовательские накопители. При запуске этой команды в качестве рабочего не должен использоваться каталог, который предполагается удалить. В следующем примере сначала изменяется рабочий каталог, а затем осуществляется удаление накопителя ps.
cd C:; Remove-PSDrive ps
Нужно иметь в виду, что все накопители, созданные в ходе рабочего сеанса, сохраняются лишь до его окончания. Поэтому удалять накопители не требуется — кроме тех случаев, когда пользователю нужно удалить накопитель явным образом. Возможно, вы сочтете целесообразным сократить список доступных накопителей, когда одно из этих виртуальных устройств вам уже будет не нужно. Перенести пользовательский накопитель из одного сеанса в другой можно путем изменения файла профиля пользователя. В одной из следующих статей я расскажу о том, как создавать и оптимизировать файлы профилей. Впрочем, если вам нужно получить дополнительные сведения о файлах профилей прямо сейчас, следует познакомиться с подготовленной специалистами TechNet статьей «Window PowerShell Profiles» (technet.microsoft.com/en-us/library/cc162758.aspx).
Серия закончена, но тема не закрыта
На этом уроке мы рассмотрели провайдеры и накопители PowerShell. Как видно из приведенных примеров, обращаться к целому ряду хранилищ данных можно так же, как к файлам и папкам. Кроме того, поскольку в среде PowerShell используются провайдеры и накопители, методы обращения к данным не зависят от особенностей хранилища данных. В сущности, многое из того, что вы узнали из серии статей о PowerShell для начинающих, можно использовать применительно к различным накопителям. Когда мы начнем публиковать следующую серию статей PowerShell для опытных пользователей, вы сможете использовать информацию, усвоенную на этом и на других уроках, для создания сложных инструкций, чтобы обращаться к широкому спектру ресурсов и манипулировать ими.
Роберт Шелдон (contact@rhsheldon.com) — технический консультант и автор книг, статей и учебных материалов по проблематике Microsoft Windows и различным системам управления реляционными базами данных (включая SQL Server), а также по вопросам проектирования и реализации систем бизнес-аналитики