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

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

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

В предыдущей статье этой серии я показал вам, как создать функцию PowerShell, которую я назвал Get-Smart. Эта функция была разработана для получения информации SMART для дисков на каждом из наших серверов. Когда я создал эту функцию, я создал небольшой скрипт (который включал эту функцию). Задача скрипта заключалась в том, чтобы передать функции имена серверов. Для справки, вот этот скрипт еще раз:

Функция Get-Smart

{

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

}

 

$Servers = @("Prod1", "Prod2")

ForEach ($Server в $Servers) {

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

}

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

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

$Pdisk= Get-PhysicalDisk

ForEach ($LDisk в $PDisk)

{

$LDisk.FriendlyName

$LDisk.HealthStatus

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

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

}

В этом блоке кода происходит много всего, поэтому я хочу показать вам его построчно. Первая строка устанавливает переменную с именем Pdisk. Вы можете использовать любое имя переменной. Я использовал Pdisk, потому что он напоминает мне PhysicalDisk. Содержимое переменной равно полному выводу командлета Get-PhysicalDisk.

Во второй строке кода используется командлет ForEach. На этот раз я настраиваю вторую переменную с именем Ldisk. Опять же, вы можете использовать любое имя переменной, какое захотите. На мой взгляд, Ldisk означает локальный диск. Эта строка создает цикл, который берет выходные данные команды Get-PhysicalDisk и обрабатывает их по одному диску за раз. Вы заметите, что третья строка — это символ фигурной скобки ( { ). Все, что находится между символами { и }, является частью цикла. Инструкции, находящиеся между { и }, выполняются для каждого отдельного диска.

Следующая строка — $Ldisk.FriendlyName. Помните, $Ldisk представляет один конкретный диск. Например, переменная $Ldisk потенциально может представлять следующее:

Get-PhysicalDisk PhysicalDisk0

Таким образом, эта строка кода вызывает отображение содержимого одного из атрибутов диска (в данном случае понятного имени).

Следующая строка кода работает точно так же, как и предыдущая. На этот раз вместо отображения понятного имени диска мы отображаем состояние работоспособности диска.

Следующая строка является самой длинной во всем сценарии. Эта строка:

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

Чтобы понять, что делает эта строка, вы должны помнить, что в любой момент переменная $Ldisk представляет командлет Get-PhysicalDisk и конкретный диск в системе. Таким образом, мы запускаем командлет Get-PhysicalDisk для определенного диска, а затем перенаправляем выходные данные на командлет Get-StorageReliabilityCounter. Командлет Select-Object позволяет нам управлять отображаемыми атрибутами. В этом случае мы смотрим на общее количество ошибок чтения и записи, а также на температуру диска.

Следующая строка:

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

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

Наконец, последняя строка кода — это символ }, закрывающий цикл.

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

Изображение 4678
Рисунок A: Наш сценарий отображает различную статистику работоспособности для каждого из дисков системы.

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

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

Я создал сценарий, который извлекает как информацию 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

}

Результат работы скрипта вы можете увидеть на рисунке B.

Изображение 4679
Рисунок B: Это частичный вывод скрипта, показанного выше.

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

Вывод

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

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