Привет! Как большой поклонник и активный практик PowerShell Мне часто приходится повторно использовать ранее написанные фрагменты кода.
Собственно, для современных языков программирования повторное использование кода — обычное дело.
PowerShell не отстает в этом вопросе и предлагает разработчикам (скриптописателям) несколько механизмов доступа к ранее написанному коду.
Здесь они усложняются: использование функций, точечный поиск и написание собственных модулей.
Давайте рассмотрим их все по порядку.
В качестве решения лабораторной задачи напишем скрипт, расширяющий раздел С:\ до максимально возможного размера на удаленном сервере Windows ЛАБ-ФС1 .
Такой скрипт будет состоять из одной строки и выглядеть следующим образом:
Это работает следующим образом.Invoke-Command -ComputerName LAB-FS1 -ScriptBlock { "rescan", "select volume=c", "extend" | diskpart }
Сначала PowerShell устанавливает удаленное соединение с сервером ЛАБ-ФС1 и запускает на нем локально набор команд, заключенных в фигурные скобки параметров -ScriptBlock .
Этот набор в свою очередь последовательно передает команду часть диска три текстовых параметра и часть диска выполняет (поочередно) повторное сканирование разделов, выбирая раздел С:\ и расширяем его до максимально возможного размера.
Как видите, скрипт предельно простой, но в то же время чрезвычайно полезный.
Давайте посмотрим, как правильно упаковать его для повторного использования.
1. Использование функций Самый простой вариант. Давайте предположим, что мы пишем большой скрипт, в котором по разным причинам нам нужно многократно запускать расширение разделов на разных серверах.
Самое логичное — выделить весь этот скрипт в отдельную функцию в том же .
ps1-файле и потом просто вызывать его по мере необходимости в дальнейшем.
Кроме того, мы расширим функционал скрипта, дав возможность администратору явно указывать имя удаленного сервера и букву расширяемого раздела.
Мы передадим имя и букву с помощью параметров.
Функция и ее вызов будут выглядеть так: function ExtendDisk-Remotely
{
param (
[Parameter (Mandatory = $true)]
[string] $ComputerName,
[Parameter (Mandatory = $false)]
[string] $DiskDrive = "c"
)
Invoke-Command -ComputerName $ComputerName -ScriptBlock {"rescan", "select volume=$using:DiskDrive", "extend" | diskpart}
}
ExtendDisk-Remotely -ComputerName LAB-FS1
Здесь для функции ExtendDisk-Удаленно указаны два параметра:
- Необходимый Имя компьютера ;
- Необязательный Дисковод .
Нет возможности задать имя диска явно, скрипт будет работать с диском С:\
Сохраним скрипт под именем Пример-01-Functions.ps1 и запустите:
Видим, что наша функция успешно вызвалась и расширила раздел С:\ на сервере ЛАБ-ФС1 .
2. Точечный поиск Давайте усложним ситуацию.
Наша функция расширения разделов оказалась настолько удачной, что мы хотим использовать ее в других скриптах.
Что я должен делать? Скопировать функциональный текст из исходного файла .
ps1 и вставить во все необходимые? Что, если код функции регулярно обновляется? Что делать, если эта функция нужна сотням скриптов? Очевидно, нужно вынести его в отдельный файл и подключать по мере необходимости.
Давайте создадим отдельный файл для всех наших функций и назовем его Пример-02-DotSourcing.ps1 .
Его содержимое будет таким: function ExtendDisk-Remotely
{
param (
[Parameter (Mandatory = $true)]
[string] $ComputerName,
[Parameter (Mandatory = $false)]
[string] $DiskDrive = "c"
)
Invoke-Command -ComputerName $ComputerName -ScriptBlock {"rescan", "select volume=$using:DiskDrive", "extend" | diskpart}
}
Это объявление функции (без вызова), которая теперь хранится в отдельном файле и может быть вызвана в любой момент с помощью метода, называемого точечным поиском.
Синтаксис выглядит следующим образом: .
C:\Scripts\Example-02-DotSourcing.ps1
ExtendDisk-Remotely LAB-FS1
Внимательно посмотрите на первую строку кода и проанализируйте ее содержимое: точка , космос , путь к файлу с описанием функции .
Этот синтаксис позволяет нам подключить содержимое файла к текущему скрипту.
Пример-02-DotSourcing.ps1 .
Это то же самое, что использовать директиву #включать В С++ или команда с использованием В С# — подключение фрагментов кода из внешних источников.
После подключения внешнего файла мы уже можем во второй строке вызывать входящие в него функции, что и успешно делаем.
При этом бэккасить внешний файл можно не только в теле скрипта, но и в «голой» консоли PowerShell:
Вы можете использовать технику дотсорсинга, и она вам подойдет, но гораздо удобнее использовать более современный метод, который мы рассмотрим в следующем разделе.
3. Написание собственного модуля PowerShell
Внимание: Я использую его на работе PowerShell версия 4. Одной из его особенностей является то, что он автоматически загружает модули в оперативную память по мере обращения к ним без использования командлета.Давайте ещё раз усложним ситуацию.Импорт-Модуль .
В старых версиях PowerShell (начиная с 2) то, что написано ниже, будет работать, но может потребовать дополнительных манипуляций, связанных с предварительным импортом модулей перед их использованием.
Мы рассмотрим современные среды.
Мы стали очень хорошими PowerShell -программисты, написали сотни полезных функций, разбили их на десятки файлов .
ps1 для удобства использования и рассортировали нужные файлы по нужным нам скриптам.
Что делать, если у нас есть десятки файлов для дотсорсинга и их нужно указать в сотнях скриптов? Что, если мы переименуем несколько из них? Очевидно, что вам придется во всех скриптах менять пути ко всем файлам — это ужасно неудобно.
Вот почему.
Сколько бы многоразовых функций вы ни написали, даже одну, сразу оформляйте ее в отдельный модуль.
Написание собственных модулей — это самый простой, лучший, современный и разумный метод повторного использования кода в PowerShell .
Что такое модуль Windows PowerShell
Модуль Windows PowerShell — это набор функциональных возможностей, который в том или ином виде находится в отдельных файлах операционной системы.Например, все собственные модули Microsoft являются двоичными и представляют собой скомпилированные библиотеки .
dll. Напишем модуль скрипта — скопируем в него код из файла Пример-02-DotSourcing.ps1 и сохраните его как файл с расширением .
psm1. Чтобы понять, куда сохранять, посмотрим на содержимое переменной окружения PSModulePath .
Мы видим, что по умолчанию у нас есть три папки, в которых PowerShell будет искать модули.
Значение переменной PSModulePath можно редактировать с помощью групповых политик, задав таким образом пути к модулям для всей сети, но это уже другая история, и мы ее сейчас рассматривать не будем.
Но мы будем работать с папкой C:\Пользователи\Администратор\Документы\WindowsPowerShell\Модули и сохраняем в него наш модуль.
Код остается прежним: function ExtendDisk-Remotely
{
param (
[Parameter (Mandatory = $true)]
[string] $ComputerName,
[Parameter (Mandatory = $false)]
[string] $DiskDrive = "c"
)
Invoke-Command -ComputerName $ComputerName -ScriptBlock {"rescan", "select volume=$using:DiskDrive", "extend" | diskpart}
}
Меняется только папка, в которой сохраняется файл, и его расширение.
Очень важно! Внутри папки Модули вам необходимо создать подпапку с названием нашего модуля.Наш модуль готов и мы можем проверить, что он виден в системе:Пусть это имя будет Удаленное управление дисками .
Сохраняем наш файл внутри этой подпапки и отдаем его точно так же имя и расширение .
psm1 — получить файл C:\Пользователи\Администратор\Документы\WindowsPowerShell\Модули\ RemoteDiskManagement\RemoteDiskManagement.psm1 .
Модуль видим, и в дальнейшем мы можем вызывать его функции без предварительного объявления их в теле скрипта или дотсорсинге.
PowerShell примет нашу функцию ExtendDisk-Удаленно как «встроенный» и подключаем его при необходимости:
Вот и все: мы можем писать десятки собственных модулей, редактировать код входящих в них функций и использовать их в любой момент, не задумываясь о том, какому скрипту нужно изменить имя функции или путь к файлу dotssource.
4. Другие расширенные функции
Как я уже писал, я люблю PowerShell , и если сообществу будет интересно, могу написать еще с десяток статей о его расширенном функционале.
Примеры тем для обсуждения: добавление справки к написанным функциям и модулям; как заставить свою функцию принимать значения из конвейера и какие особенности это накладывает на написание скрипта; что такое конвейерная лента и с чем ее едят? как использовать PowerShell работа с базами данных; как структурированы расширенные функции и какие свойства могут иметь их параметры и т. д. Интересный? Потом постараюсь публиковать по одной статье в неделю.
Теги: #PowerShell #сервер Windows
-
Вам Действительно Нужны Все Эти Сценарии?
19 Oct, 24 -
Революция Компакт-Дисков И Графика
19 Oct, 24 -
Интернет-Магазин Будущего
19 Oct, 24 -
Что Можно Увидеть С Эвереста
19 Oct, 24 -
Миранда Им 0.6.6
19 Oct, 24