Расширенный Powershell, Том. 1: Повторное Использование Кода

Привет! Как большой поклонник и активный практик PowerShell Мне часто приходится повторно использовать ранее написанные фрагменты кода.

Собственно, для современных языков программирования повторное использование кода — обычное дело.

PowerShell не отстает в этом вопросе и предлагает разработчикам (скриптописателям) несколько механизмов доступа к ранее написанному коду.

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

Давайте рассмотрим их все по порядку.

В качестве решения лабораторной задачи напишем скрипт, расширяющий раздел С:\ до максимально возможного размера на удаленном сервере Windows ЛАБ-ФС1 .

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

  
  
  
  
   

Invoke-Command -ComputerName LAB-FS1 -ScriptBlock { "rescan", "select volume=c", "extend" | diskpart }

Это работает следующим образом.

Сначала PowerShell устанавливает удаленное соединение с сервером ЛАБ-ФС1 и запускает на нем локально набор команд, заключенных в фигурные скобки параметров -ScriptBlock .

Этот набор в свою очередь последовательно передает команду часть диска три текстовых параметра и часть диска выполняет (поочередно) повторное сканирование разделов, выбирая раздел С:\ и расширяем его до максимально возможного размера.



Расширенный PowerShell, том.
</p><p>
 1: повторное использование кода

Как видите, скрипт предельно простой, но в то же время чрезвычайно полезный.

Давайте посмотрим, как правильно упаковать его для повторного использования.

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 и запустите:

Расширенный PowerShell, том.
</p><p>
 1: повторное использование кода

Видим, что наша функция успешно вызвалась и расширила раздел С:\ на сервере ЛАБ-ФС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:

Расширенный PowerShell, том.
</p><p>
 1: повторное использование кода

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

3. Написание собственного модуля PowerShell

Внимание: Я использую его на работе PowerShell версия 4. Одной из его особенностей является то, что он автоматически загружает модули в оперативную память по мере обращения к ним без использования командлета.

Импорт-Модуль .

В старых версиях PowerShell (начиная с 2) то, что написано ниже, будет работать, но может потребовать дополнительных манипуляций, связанных с предварительным импортом модулей перед их использованием.

Мы рассмотрим современные среды.

Давайте ещё раз усложним ситуацию.

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

ps1 для удобства использования и рассортировали нужные файлы по нужным нам скриптам.

Что делать, если у нас есть десятки файлов для дотсорсинга и их нужно указать в сотнях скриптов? Что, если мы переименуем несколько из них? Очевидно, что вам придется во всех скриптах менять пути ко всем файлам — это ужасно неудобно.

Вот почему.

Сколько бы многоразовых функций вы ни написали, даже одну, сразу оформляйте ее в отдельный модуль.

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



Что такое модуль Windows PowerShell

Модуль Windows PowerShell — это набор функциональных возможностей, который в том или ином виде находится в отдельных файлах операционной системы.

Например, все собственные модули Microsoft являются двоичными и представляют собой скомпилированные библиотеки .

dll. Напишем модуль скрипта — скопируем в него код из файла Пример-02-DotSourcing.ps1 и сохраните его как файл с расширением .

psm1. Чтобы понять, куда сохранять, посмотрим на содержимое переменной окружения PSModulePath .



Расширенный PowerShell, том.
</p><p>
 1: повторное использование кода

Мы видим, что по умолчанию у нас есть три папки, в которых 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, том.
</p><p>
 1: повторное использование кода

Модуль видим, и в дальнейшем мы можем вызывать его функции без предварительного объявления их в теле скрипта или дотсорсинге.

PowerShell примет нашу функцию ExtendDisk-Удаленно как «встроенный» и подключаем его при необходимости:

Расширенный PowerShell, том.
</p><p>
 1: повторное использование кода

Вот и все: мы можем писать десятки собственных модулей, редактировать код входящих в них функций и использовать их в любой момент, не задумываясь о том, какому скрипту нужно изменить имя функции или путь к файлу dotssource. 4. Другие расширенные функции Как я уже писал, я люблю PowerShell , и если сообществу будет интересно, могу написать еще с десяток статей о его расширенном функционале.

Примеры тем для обсуждения: добавление справки к написанным функциям и модулям; как заставить свою функцию принимать значения из конвейера и какие особенности это накладывает на написание скрипта; что такое конвейерная лента и с чем ее едят? как использовать PowerShell работа с базами данных; как структурированы расширенные функции и какие свойства могут иметь их параметры и т. д. Интересный? Потом постараюсь публиковать по одной статье в неделю.

Теги: #PowerShell #сервер Windows

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.