PowerShell для управления хранилищем и файловой системой (часть 4)
- PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 11)
В моей предыдущей статье я подробно рассказал об изучении методов оценки состояния диска с помощью PowerShell. Теперь пришло время взять все эти методы и превратить их в своего рода полезный сценарий.
Несмотря на то, что методы, которые были рассмотрены в предыдущей статье, были, по крайней мере, несколько простыми, сценарий, который мы будем создавать, будет немного отличаться от того, как вы, возможно, привыкли делать что-то — по крайней мере, структурно. Вот в чем проблема.
Очевидно, полезно иметь возможность получать информацию о состоянии диска сервера. Однако наш сценарий, вероятно, был бы намного полезнее, если бы мы могли проверить работоспособность дисков для всех наших серверов. Обычно, если бы мне нужно было написать такой сценарий в PowerShell, я бы, вероятно, создал переменную, содержащую список моих серверов, а затем выполнил различные диагностические команды для каждого сервера. Хотя такой вариант возможен, командлет Get-PhysicalDisk не может вывести имя сервера, по крайней мере, сам по себе. Представьте, если бы мы обнаружили проблемы с диском… Мы могли бы сообщить о проблеме, но было бы сложно сказать, на каком сервере существует диск. В таком случае я собираюсь создать сценарий таким образом, чтобы он позволял мне работать с каждым сервером индивидуально.
Итак, вот план. Я собираюсь начать с создания базового сценария, который просматривает информацию о состоянии диска и отображает соответствующие выходные данные. Это шаг 1. Как только я заработаю, следующим шагом будет фильтрация вывода, чтобы отображались только элементы, требующие внимания. В конце концов, мы не хотим сортировать список из сотен дисков, чтобы увидеть, есть ли проблема. В отчете должно быть указано, в чем заключается проблема, но при этом не должно быть слишком много беспорядка в процессе. Это Шаг 2. В конце концов мы перейдем к Шагу 2, но из-за сложности того, что я делаю, нам нужно сначала заставить работать Шаг 1.
Если вам интересно, есть Шаг 3. Шаг 3 — настройка автоматизации. Сценарий должен запускаться автоматически по расписанию, и у него должен быть способ предупредить администратора, если что-то пойдет не так.
Таков план. К тому времени, когда мы закончим, у нас должен быть надежный механизм для создания отчетов о работоспособности хранилища для всех наших серверов.
Итак, с учетом сказанного, первое, о чем мне нужно поговорить, — это функции PowerShell. Помните, я сказал, что нам придется иметь дело с серверами по одному? Для этого мы создадим пару функций, а затем передадим им имя каждого отдельного сервера, но я забегаю вперед.
Для всех практических целей вы можете думать о функции PowerShell как о блоке повторяемого кода. Позволь мне объяснить.
Рискуя показаться очень старым. Впервые я изучил программирование в детстве, в 80-х годах. В то время предпочтительным языком программирования для домашних компьютеров, таких как CoCo и Commodore 64, был BASIC, или базовый номер строки, как он известен сегодня. Те из вас, кто помнит программирование на BASIC по урокам в школе или по игре на компьютере дома, могут вспомнить команду под названием GOSUB. Команда GOSUB заставит логику программы перейти к заданному номеру строки. Эта строка означала начало подпрограммы — блока кода, который можно было использовать несколько раз. Подпрограмма заканчивалась командой RETURN, которая заставляла выполнение программы вернуться к точке обхода.
Функции PowerShell очень похожи на те старые подпрограммы BASIC, но с парой важных отличий. Наиболее очевидным отличием является то, что PowerShell не использует номера строк. Таким образом, вызов функции PowerShell ссылается не на номер строки, а на имя функции. У каждой функции PowerShell есть имя.
Другое отличие состоит в том, что PowerShell позволяет передавать параметры в функцию (при необходимости) и при необходимости возвращать параметры из функции. В базовой строке не было концепции отправки значений в подпрограмму или из нее.
Итак, давайте взглянем на структуру функции PowerShell. Как упоминалось ранее, функция на самом деле представляет собой не что иное, как именованный блок повторяемого кода.
Если вы когда-либо посещали курсы программирования, то вы, несомненно, знакомы со старой программой Hello World. Если вы никогда не видели этого раньше, это чрезвычайно простая программа, которая отображает слова Hello World на экране. Обычно это первая программа, которую преподают на любом курсе программирования начального уровня.
В PowerShell вы можете отобразить Hello World, просто набрав:
"Привет, мир"
Но что, если вы хотите сделать это с помощью функции? Ну, первое, что нам нужно, это имя для функции. В последние годы стало обычным делом давать функциям имена, напоминающие командлеты PowerShell, поэтому мы назовем нашу функцию Hello-World. Сама функция может выглядеть примерно так:
Функция Hello-World
{
"Привет, мир"
}
Итак, как видите, мы используем слово «Функция» для обозначения начала функции. За словом Функция следует имя функции (Hello-World). Код, из которого состоит функция, заключен в фигурные скобки {}. Вот и все. Это простая функция PowerShell. Чтобы вызвать эту функцию, мы просто напечатаем Hello-World.
Вы можете увидеть пример этого на рисунке A. Функция, показанная на рисунке, не использует никаких разрывов строк, потому что я ввел код функции в командной строке, а не вводил его в скрипт, но все ранее упомянутые компоненты по-прежнему существует.
Рисунок A. Это чрезвычайно простая функция PowerShell.
А что, если мы хотим передать параметр функции? Есть несколько способов сделать это, но, может быть, я хочу передать свое имя функции, чтобы функция поздоровалась со мной. Я мог бы сделать это с помощью этого кода:
Функция Hello-Name
{
«Привет, $Input»
}
Как видите, я назвал функцию Hello-Name, и функция принимает переменную с именем $Input. Если бы я хотел передать свое имя этой переменной, я мог бы сделать это следующим образом:
«Брайен» | Привет-имя
Вы можете увидеть, как это работает, на рисунке B.
Рисунок B. Я передал свое имя функции.
Как я уже сказал, существует много разных способов передачи значений в функции и из них, но это самый простой способ, который я мог придумать.
Вывод
Теперь, когда вы знаете основную конструкцию функции, мы можем приступить к созданию нашего скрипта. Мы создадим две функции. Один проверит состояние SMART диска, а другой проверит основную информацию о состоянии. Мы можем запускать эти функции на удаленных компьютерах, используя командлет Invoke-Command.
- PowerShell для управления хранилищем и файловой системой (часть 2)
- PowerShell для управления хранилищем и файловой системой (часть 3)
- PowerShell для управления хранилищем и файловой системой (часть 5)
- PowerShell для управления хранилищем и файловой системой (часть 6)
- PowerShell для управления хранилищем и файловой системой (часть 7)
- PowerShell для управления хранилищем и файловой системой (часть 11)