PowerShell для управления хранилищем и файловой системой (часть 7)

Опубликовано: 18 Марта, 2023

  • PowerShell для управления хранилищем и файловой системой (часть 2)
  • PowerShell для управления хранилищем и файловой системой (часть 3)
  • PowerShell для управления хранилищем и файловой системой (часть 4)
  • PowerShell для управления хранилищем и файловой системой (часть 5)
  • PowerShell для управления хранилищем и файловой системой (часть 6)
  • PowerShell для управления хранилищем и файловой системой (часть 11)

В моей предыдущей статье я показал вам, как создать сценарий, который будет получать информацию SMART и информацию о состоянии дисков для компьютеров в вашей сети. Скрипт даже мог просматривать несколько серверов. Было всего две проблемы со сценарием. Во-первых, это было несколько сложно. Во-вторых, он может производить огромное количество данных.

Моя цель в этой статье — решить эти две проблемы. Я мало что могу сделать, чтобы упростить сценарий, не жертвуя при этом функциональностью, но я хочу провести вас по сценарию, чтобы вы могли понять, как он работает. Что касается сценария, который потенциально может производить слишком много данных, я в конце концов покажу вам, как добавить некоторые фильтры, которые предотвратят это. А пока давайте пройдемся по логике скрипта. Вот как выглядит скрипт в его нынешнем виде:

Функция Get-Smart

# Функция для получения информации SMART о диске

{

(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)

}

 

Функция Get-Health

# Функция для получения информации о состоянии диска

{

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

{

$LDisk.FriendlyName

$LDisk.HealthStatus

$LДиск | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature | Флорида

Write-Host ==================

}

}

 

#Тело сценария

$Servers = @("Hyper-V-1", "Hyper-V-2")

ForEach ($Server в $Servers) {

$ сервер | Поумнеть

Enter-PSSession -имя_компьютера $Server

Получить здоровье

Exit-PSSession

}

Когда вы посмотрите на сценарий, показанный выше, вы заметите, что он содержит три основных раздела. Есть функция Get-Smart, еще одна функция Get-Health, а также основная часть скрипта.

Функции PowerShell не выполняются до тех пор, пока они не будут вызваны. Таким образом, при запуске скрипта PowerShell изначально игнорирует две функции и начинает фактическое выполнение кода в теле скрипта. Для справки, вот тело скрипта:

#Тело сценария

$Servers = @("Hyper-V-1", "Hyper-V-2")

ForEach ($Server в $Servers) {

$ сервер | Поумнеть

Enter-PSSession -имя_компьютера $Server

Получить здоровье

Exit-PSSession

}

Первая строка кода в приведенном выше блоке кода (#Script Body) — это просто комментарий, поэтому PowerShell игнорирует ее.

Во второй строке кода мы определяем имена серверов, которые хотим проанализировать. В данном случае эти серверы называются Hyper-V-1 и Hyper-V-2. Очевидно, вы замените эти имена серверов именами ваших собственных серверов. В моем сценарии я анализирую только два сервера, потому что хотел упростить задачу, но вы легко можете добавить больше серверов. Имена серверов необходимо заключать в кавычки и отделять друг от друга запятой. Между прочим, имена серверов хранятся в массиве с именем $Servers.

В следующей строке начинается настоящее действие. В этой строке используется команда ForEach для создания цикла. В этом случае мы выполняем набор задач для каждого $server в $servers. Вы заметите, что эта команда заканчивается фигурной скобкой и что в конце блока кода есть еще одна фигурная скобка. Код между двумя фигурными скобками выполняется один раз для каждого сервера в списке серверов. На самом деле строка ForEach говорит о том, что нам нужно выполнить набор шагов для каждого сервера в списке серверов.

Итак, что это за шаги? Ну, на самом деле инструкций всего четыре. Первый — это $Server | Поумнеть. Эта команда указывает PowerShell отправить имя сервера функции Get-Smart, которая, в свою очередь, получит информацию SMART для указанного сервера. Я пройдусь по этой функции через мгновение, но сначала я хочу закончить с основной частью.

Следующая строка кода — Enter-PSSession —ComputerName $Smart. Эта строка кода указывает PowerShell установить удаленный сеанс с указанным сервером. Таким образом, команды PowerShell могут выполняться удаленно на этом сервере.

Следующая строка — Get-Health. Как обсуждалось ранее, Get-Health — это не собственный командлет PowerShell, а название функции. Таким образом, эта строка вызывает функцию Get-Health.

Последняя строка кода перед закрывающей фигурной скобкой — Exit-PSSession. Другими словами, сценарий устанавливает сеанс с удаленным сервером, запускает функцию Get-Health для указанного сервера, а затем завершает сеанс.

Итак, теперь, когда я провел вас через основную часть скрипта, что насчет отдельных функций? Ну, есть две функции, и первая — это функция Get-Smart. Вот функция:

Функция Get-Smart

# Функция для получения информации SMART о диске

{

(Get-WmiObject -namespace rootwmi –class MSStorageDriver_FailurePredictStatus -ComputerName $Input | Select-Object PSComputerName, InstanceName, PredictFailure, Reason)

}

Когда основная часть скрипта вызывает функцию Get-Smart, она передает ей имя сервера. Функция содержит только одну строку исполняемого кода, и большая часть этого кода обсуждалась в предыдущей статье. Важно обратить внимание на параметр –ComputerName, за которым следует $Input. Переменная $Input относится к значению, которое передается функции. В данном случае это имя сервера.

Сценарий также содержит функцию Get-Health. Вот как выглядит эта функция:

Функция Get-Health

# Функция для получения информации о состоянии диска

{

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

{

$LDisk.FriendlyName

$LDisk.HealthStatus

$LДиск | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature | Флорида

Write-Host ==================

}

}

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

Хотя функция кажется немного запутанной, она относительно проста. Мы начинаем с создания переменной с именем $Pdisk, которая содержит список всех физических дисков на сервере. Затем мы используем команду ForEach для создания цикла. В этом случае цикл позволяет нам исследовать каждый из дисков сервера в отдельности. По сути, мы говорим PowerShell выполнить набор шагов для каждого диска в списке физических шагов.

И снова шаги цикла заключены в фигурные скобки. Я не буду утомлять вас обсуждением отдельных шагов цикла, потому что они были рассмотрены в предыдущей статье. Эти шаги просто отображают понятное имя диска и его состояние работоспособности. Блок кода продолжает извлекать и отображать общее количество ошибок чтения и записи, а также температуру диска из счетчика надежности.

Если вас интересует строка Write-Host ===========, эта строка просто указывает PowerShell отображать на экране несколько знаков равенства. Я использую это как разделитель, который упрощает различие между одним диском и другим. Статистика каждого диска отображается между строками со знаком равенства.

Вывод

Я искренне надеюсь, что вы нашли мое объяснение команд этого скрипта полезным, и что вы начинаете получать некоторые идеи о том, как такой скрипт может быть полезен в вашей организации. В следующей статье этой серии я начну рассмотрение возможности информационной перегрузки.

  • PowerShell для управления хранилищем и файловой системой (часть 2)
  • PowerShell для управления хранилищем и файловой системой (часть 3)
  • PowerShell для управления хранилищем и файловой системой (часть 4)
  • PowerShell для управления хранилищем и файловой системой (часть 5)
  • PowerShell для управления хранилищем и файловой системой (часть 6)
  • PowerShell для управления хранилищем и файловой системой (часть 11)