- Глава 10. Модули скриптов Chapter 10 — Script modules
- Функции вызова с использованием точки Dot-Sourcing Functions
- Модули скриптов Script Modules
- Манифесты модулей Module Manifests
- Определение общих и частных функций Defining Public and Private Functions
- Сводка Summary
- Powershell установка модулей.
- Powershell установка модулей offline
Глава 10. Модули скриптов Chapter 10 — Script modules
Преобразование ваших однострочных элементов кода и скриптов в PowerShell в многократно используемые средства станет еще более важным процессом, если вы будете регулярно его выполнять. Turning your one-liners and scripts in PowerShell into reusable tools becomes even more important if it’s something that you’re going to use frequently. После упаковки функций в модуль скрипта они выглядят более профессионально, что облегчает их совместное использование. Packaging your functions in a script module makes them look and feel more professional and makes them easier to share.
Функции вызова с использованием точки Dot-Sourcing Functions
В предыдущей главе мы с вами не рассматривали функции вызова с использованием точки. Something that we didn’t talk about in the previous chapter is dot-sourcing functions. Если функция в скрипте не является частью модуля, единственный способ загрузить его в память — вызвать файл .PS1 с точкой, в котором он сохранен. When a function in a script isn’t part of a module, the only way to load it into memory is to dot-source the .PS1 file that it’s saved in.
Следующая функция сохранена как Get-MrPSVersion.ps1 . The following function has been saved as Get-MrPSVersion.ps1 .
При запуске скрипта ничего не происходит. When you run the script, nothing happens.
Если вы попытаетесь вызвать эту функцию, появится сообщение об ошибке. If you try to call the function, it generates an error message.
Вы можете определить, загружаются ли функции в память, если проверите, есть ли они в PSDrive Function. You can determine if functions are loaded into memory by checking to see if they exist on the Function PSDrive.
Проблема с вызовом скрипта, содержащего функцию, состоит в том, что функции загружаются в область Script. The problem with calling the script that contains the function is that the functions are loaded in the Script scope. После выполнения скрипта область удаляется и вместе с ней удаляется функция. When the script completes, that scope is removed and the function is removed with it.
Функция должна быть загружена в область Global. The function needs to be loaded into the Global scope. Это можно сделать вызовом скрипта с точкой, который содержит эту функцию. That can be accomplished by dot-sourcing the script that contains the function. При этом можно использовать относительный путь. The relative path can be used.
Кроме того, можно использовать полный путь. The fully qualified path can also be used.
Если часть пути хранится в переменной, ее можно объединить с оставшейся частью пути. If a portion of the path is stored in a variable, it can be combined with the remainder of the path. Для объединения переменной вместе с оставшейся частью пути не нужно использовать объединение строк. There’s no reason to use string concatenation to combine the variable together with the remainder of the path.
Теперь, когда я проверяю PSDrive Function, функция Get-MrPSVersion существует. Now when I check the Function PSDrive, the Get-MrPSVersion function exists.
Модули скриптов Script Modules
Модуль скрипта в PowerShell — это всего лишь файл, содержащий одну функцию или несколько, сохраненных в виде файла .PSM1 , а не файла .PS1 . A script module in PowerShell is simply a file containing one or more functions that’s saved as a .PSM1 file instead of a .PS1 file.
Как создать модуль скрипта? How do you create a script module? Вероятно, вы думаете, что это можно сделать с помощью команды с именем вроде New-Module . You’re probably guessing with a command named something like New-Module . Ваше предположение будет неверным. Your assumption would be wrong. Хотя в PowerShell есть команда с именем New-Module , она создает динамический модуль, а не модуль скрипта. While there is a command in PowerShell named New-Module , that command creates a dynamic module, not a script module. Обязательно ознакомьтесь со справкой для команды, даже если считаете, что нашли нужную команду. Always be sure to read the help for a command even when you think you’ve found the command you need.
В предыдущей главе я говорил, что функции должны использовать утвержденные команды, иначе при импорте модуля будет появляться предупреждающее сообщение. In the previous chapter, I mentioned that functions should use approved verbs otherwise they’ll generate a warning message when the module is imported. В следующем коде командлет New-Module используется для создания динамического модуля в памяти. The following code uses the New-Module cmdlet to create a dynamic module in memory. Этот модуль демонстрирует предупреждение о неутвержденной команде. This module demonstrates the unapproved verb warning.
Хотя в предыдущем примере использовался командлет New-Module , эта команда используется только для повторной итерации, а не для создания модулей скрипта в PowerShell. Just to reiterate, although the New-Module cmdlet was used in the previous example, that’s not the command for creating script modules in PowerShell.
Сохраните следующие две функции в файле с именем MyScriptModule.psm1 . Save the following two functions in a file named MyScriptModule.psm1 .
Попробуйте вызвать одну из функций. Try to call one of the functions.
Появится сообщение об ошибке, в котором говорится, что функция не найдена. An error message is generated saying the function can’t be found. Кроме того, вы можете проверить PSDrive Function так, как делали это раньше, и увидите, что ее там тоже нет. You could also check the Function PSDrive just like before and you’ll find that it doesn’t exist there either.
Вы можете импортировать файл вручную с помощью командлета Import-Module . You could manually import the file with the Import-Module cmdlet.
Функция автозагрузки модулей появилась в PowerShell версии 3. The module autoloading feature was introduced in PowerShell version 3. Чтобы воспользоваться преимуществами автозагрузки модулей, необходимо сохранить модуль скрипта в папке с тем же базовым именем, что и файл .PSM1 , и в расположении, указанном в $env:PSModulePath . To take advantage of module autoloading, a script module needs to be saved in a folder with the same base name as the .PSM1 file and in a location specified in $env:PSModulePath .
Полученные результаты будет нелегко прочитать. The results are difficult to read. Так как пути разделяются точкой с запятой, можно разбить результаты, чтобы вернуть каждый путь на отдельной строке. Since the paths are separated by a semicolon, you can split the results to return each path on a separate line. Так их легче будет прочитать. This makes them easier to read.
Первые три пути в списке стандартные. The first three paths in the list are the default. При установке SQL Server Management Studio был добавлен последний путь. When SQL Server Management Studio was installed, it added the last path. Для работы автозагрузки модулей файл MyScriptModule.psm1 должен находиться в папке с именем MyScriptModule непосредственно в одном из этих путей. For module autoloading to work, the MyScriptModule.psm1 file needs to be located in a folder named MyScriptModule directly inside one of those paths.
Не так быстро. Not so fast. У меня текущий путь пользователя не находится первым в списке. For me, my current user path isn’t the first one in the list. Я почти никогда не использую этот путь, так как вхожу в систему Windows под учетной записью пользователя, отличной от той, которую я использую для запуска PowerShell. I almost never use that path since I log into Windows with a different user than the one I use to run PowerShell. Это означает, что этот путь находится не в моей обычной папке «Документы». That means it’s not located in my normal Documents folder.
AllUsers — это второй путь. The second path is the AllUsers path. В этом месте я храню все свои модули. This is the location where I store all of my modules.
Третий путь находится под C:\Windows\System32 . The third path is underneath C:\Windows\System32 . Хранить модули в этом расположении должна только корпорация Майкрософт, так как оно находится в папке операционных систем. Only Microsoft should be storing modules in that location since it resides within the operating systems folder.
После того как файл .PSM1 будет размещен в правильном пути, модуль будет автоматически загружаться при вызове одной из команд. Once the .PSM1 file is located in the correct path, the module will load automatically when one of its commands is called.
Манифесты модулей Module Manifests
Каждый модуль имеет манифест модуля. All modules should have a module manifest. Манифест модуля содержит метаданные о вашем модуле. A module manifest contains metadata about your module. Расширение файла для файла манифеста модуля — .PSD1 . The file extension for a module manifest file is .PSD1 . Не все файлы с расширением .PSD1 являются манифестами модулей. Not all files with a .PSD1 extension are module manifests. Кроме того, их можно использовать для хранения части среды конфигурации DSC. They can also be used for things such as storing the environmental portion of a DSC configuration. New-ModuleManifest используется для создания манифеста модуля. New-ModuleManifest is used to create a module manifest. Path — единственное значение, которое необходимо указать. Path is the only value that’s required. При этом модуль не будет работать, если не указан параметр RootModule. However, the module won’t work if RootModule isn’t specified. Лучше указать параметры Author и Description на тот случай, если вы решите передать модуль в репозиторий NuGet с помощью PowerShellGet, так как эти значения необходимо указать в приведенном сценарии. It’s a good idea to specify Author and Description in case you decide to upload your module to a NuGet repository with PowerShellGet since those values are required in that scenario.
Версия модуля без манифеста — 0.0. The version of a module without a manifest is 0.0. Это явное доказательство того, что модуль не имеет манифеста. This is a dead giveaway that the module doesn’t have a manifest.
Манифест модуля можно создать с помощью всех рекомендуемых данных. The module manifest can be created with all of the recommended information.
Если во время первоначального создания манифеста модуля какие-либо данные отсутствуют, их можно добавить или обновить позже с помощью Update-ModuleManifest . If any of this information is missed during the initial creation of the module manifest, it can be added or updated later using Update-ModuleManifest . Не создавайте манифест повторно с помощью New-ModuleManifest после того, как он уже создан, так как в этом случае изменится идентификатор GUID. Don’t recreate the manifest using New-ModuleManifest once it’s already created because the GUID will change.
Определение общих и частных функций Defining Public and Private Functions
Возможно, у вас есть вспомогательные функции, которые вы хотите сделать частными и доступными только для других функций в модуле. You may have helper functions that you may want to be private and only accessible by other functions within the module. Вспомогательные функции не предназначены для доступа пользователям вашего модуля. They are not intended to be accessible to users of your module. Это можно сделать двумя способами. There are a couple of different ways to accomplish this.
Если вы не следуете рекомендациям и у вас есть только файл .PSM1 , единственный вариант для вас — использовать командлет Export-ModuleMember . If you’re not following the best practices and only have a .PSM1 file, then your only option is to use the Export-ModuleMember cmdlet.
В предыдущем примере для пользователей модуля доступна только функция Get-MrPSVersion , при этом функция Get-MrComputerName доступна для других функций в самом модуле. In the previous example, only the Get-MrPSVersion function is available to the users of your module, but the Get-MrComputerName function is available to other functions within the module itself.
Если вы добавили в модуль манифест модуля (а это необходимо), советую указать отдельные функции, которые вам нужно экспортировать, в раздел FunctionsToExport манифеста модуля. If you’ve added a module manifest to your module (and you should), then I recommend specifying the individual functions you want to export in the FunctionsToExport section of the module manifest.
Нет необходимости использовать оба Export-ModuleMember в файле .PSM1 и в разделе FunctionsToExport манифеста модуля. It’s not necessary to use both Export-ModuleMember in the .PSM1 file and the FunctionsToExport section of the module manifest. Достаточно использовать один из них. One or the other is sufficient.
Сводка Summary
В этой главе вы узнали, как преобразовать функции в модуль скрипта в PowerShell. In this chapter you’ve learned how to turn your functions into a script module in PowerShell. Кроме того, вы рассмотрели некоторые рекомендации по созданию модулей скриптов, например создание манифеста модуля для модуля скрипта. You’ve also leaned some of the best practices for creating script modules such as creating a module manifest for your script module.
Powershell установка модулей.
В работе сисадмина могут понадобиться модули, которые изначально отсутствуют в Powershell, давайте узнаем, как это исправить.
Посмотреть список доступных в системе модулей можно командой:
Процесс установки модулей будем рассматривать на примере модуля VMware.PowerCLI, который очень помогает тем, кто работает с системой виртуализации от VMware.
Итак, если ваш компьютер имеет доступ в Интернет, то установка модуля сводится к двум командам в консоли Powershell:
Если нужна определенная версия модуля:
Powershell установка модулей offline
Давайте подробнее рассмотрим вариант установки модулей, когда ваш компьютер не имеет выхода в Интернет, а действия после установки будут аналогичны для обоих вариантов.
Для того, чтобы установить модуль на компьютере, не имеющем выхода во внешнюю сеть, нужно скачать модуль на машине с выходом в Интернет. Удобнее всего это сделать при помощи Powershell, введя команды:
После того, как загрузка завершится, вы увидите в папке файлы модулей:
Теперь на компьютере, на котором нужно установить этот модуль, поместите скачанные файлы в место, где Powershell ищет установленные модули. Посмотреть места размещения модулей Powershell можно, введя в консоли