Резюме: Microsoft PFE Chris Wu рассказывает о работе с библиотеками Windows посредством PowerShell.
Microsoft Scripting Guy, Ed Wilson на связи. Сегодня мы вновь приветствуем приглашенного блогера Microsoft PFE Chris Wu. С прошлыми постами Криса вы можете ознакомиться здесь. Крис, клавиатура твоя.
Будучи вовлеченным в процесс развертывания Windows 7, один из вопросов, которые я себе задавал – как управлять Библиотеками. Библиотеки Windows позволяют организовывать файлы вне зависимости от их физического местоположения. По умолчанию в Windows присутствует 4 библиотеки: Documents, Music, Pictures и Videos. Каждая из них включает соответствующие папки профиля пользователя и публичного профиля.
Библиотеки – это те места, где в первую очередь ищут файлы такие программы, как Windows Media Player и множество приложений из Windows Store для Windows 8. С корпоративной среде может быть удобно включить в состав библиотеки общую папку группы, расположенную на сервере, вместо того, чтобы перенаправлять пользовательский каталог «Мои документы». К сожалению, настройки библиотек располагаются в файлах Library Description (*.library-ms), и не существует никаких настроек групповой политики для их контроля. Таким образом, приходится распространять на компьютеры пользователей предварительно настроенные файлы library-ms, что является достаточно неудобным.
И опять, на помощь приходит Windows PowerShell.
Windows Shell API позволяет программно конфигурировать библиотеки, а выпуск Windows API Code Pack для Microsoft .NET Framework позволяет использовать классы .NET, с которыми можно вполне удобно работать из Windows PowerShell. Для работы с Библиотеками нам потребуются 2 DLL из API Code Pack. Просто скачайте текущий релиз и распакуйте Microsoft.WindowsAPICodePack.dll и Microsoft.WindowsAPICodePack.Shell.dll (обе находятся в папке binaries) в какой-нибудь локальный каталог (например c:\tools).
После этого мы сможем выполнять следующие задачи:
Получить список существующих на компьютере Библиотек
Add-type -path Microsoft.WindowsAPICodePack.Shell.dll
[Microsoft.WindowsAPICodePack.Shell.KnownFolders]::Libraries | Select-Object Name,ParsingName
Получить настройки Библиотеки
Второй параметр метода Load указывает, подключать ли Библиотеку в режиме только для чтения. Так как мы собираемся внести изменения в настройки библиотеки, мы укажем $false.
$doc = [Microsoft.WindowsAPICodePack.Shell.ShellLibrary]::Load(«Documents», $false)
Select-Object –InputObject $doc –Property Name, Count, DefaultSaveFolder, LibraryType
Заметьте, что я не передал по конвейеру возвращенный объект ShellLibrary ($doc) командлету Select-Object, как это обычно делается. Вспомните, что Библиотека – это коллекция объектов, таким образом мы не сможем увидеть ее свойства, если передадим ее по конвейеру. Для получения же свойств отдельных папок, мы будем использовать конвейер.
$doc | Select-Object Name, Path
Добавить папку в Библиотеку
$doc.Add(«c:\docs»)
Указать место сохранения файлов по умолчанию (работает только в том случае, если целевой каталог уже включен в Библиотеку)
$doc.DefaultSaveFolder «c:\docs»
Удалить каталог из Библиотеки и закрыть объект ShellLibrary
$doc.Remove(«c:\docs»)
$doc.Close()
Создать новую Библиотеку
Библиотека – это в сущности файл .library-ms. Если он сохранен в каталоге «$env:appdata\Microsoft\Windows\Libraries» – он будет автоматически обнаружен и Библиотека будет отображена в Windows Explorer.
Мы создадим новую Библиотеку “PowerShell” и включим в нее папку локального хранилища скриптов c:\ps (на данный момент пустую).
$ps = New-Object Microsoft.WindowsAPICodePack.Shell.ShellLibrary –Argument «PowerShell»,$true
$ps.Add(«c:\ps»)
$ps.Close()
Отлично. Мы создали новую библиотеку “PowerShell”. Как и многие читатели этого блога, у меня есть множество скриптов на разные случаи жизни: некоторые предназначены для работы – находящиеся в папке, синхронизируемой через SkyDrive Pro, другие для личного пользования – они сохранены в другом каталоге SkyDrive.
Теперь, когда у меня есть Библиотека «PowerShell» я смогу отобразить все мои скрипты одним щелчком мыши. И все, что мне нужно для этого сделать – это добавить следующий код в подготовительный скрипт, который запускается один раз на каждом из моих новых компьютеров.
Add-type -path Microsoft.WindowsAPICodePack.Shell.dll
# For each Library, add SkyDrive and SkyDrive Pro folders (assuming default locations)
[Microsoft.WindowsAPICodePack.Shell.KnownFolders]::Libraries | % {
$library = [Microsoft.WindowsAPICodePack.Shell.ShellLibrary]::Load(«$($_.Name)», $false)
$library.Add(«$($env:userprofile)\Skydrive\$($_.Name)»)
$library.Add(«$($env:userprofile)\SkydrivePro\$($_.Name)»)
$library.Close()
}
# Create a PowerShell Library and include corresponding folders
$ps = New-Object Microsoft.WindowsAPICodePack.Shell.ShellLibrary –Argument «PowerShell»,$true
$ps.Add(«$($env:userprofile)\Skydrive\PowerShell»)
$ps.Add(«$($env:userprofile)\SkydrivePro\PowerShell»)
$ps.Close()
На этом все. Для получения дополнительной информации о Windows API Code Pack и классе ShellLibrary обратитесь к документации, которая предоставляется вместе в dll-файлами.
Спасибо, Крис. Я очень ценю, то что ты и другие блогеры нашли время, чтобы поделиться своими знаниями.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell