Добавление индикатора выполнения в сценарии PowerShell
Те из вас, кто знает меня или кто знаком с моей работой, знают, что я живу и дышу PowerShell. Поэтому я обычно создаю множество сценариев PowerShell, которые автоматизируют различные задачи. Но для выполнения некоторых задач может потребоваться довольно много времени, и вы можете задаться вопросом, работает ли скрипт до сих пор или он завис. Один из способов получить больше информации о сценариях PowerShell — включить индикатор выполнения.
Позвольте мне показать вам, как это работает.
Вы можете использовать командлет Write-Progress, чтобы добавить индикатор выполнения в любой сценарий PowerShell. Microsoft предоставила очень простой скрипт, чтобы показать, как работает этот командлет.
Вот сценарий:
for ($i = 1; $i -le 100; $i++) { Write-Progress -Activity "Search in Progress" -Status "$i% Completed:" -PercentComplete $i Start-Sleep -Milliseconds 250}Первая строка скрипта устанавливает цикл. Цикл начинается с переменной $i, установленной на 1, и каждый цикл цикла увеличивает значение $i на 1 ($i++). Цикл заканчивается, когда $i достигает 100.
Командлет Write-Progress включает три параметра. Во-первых, это активность. Активность — это просто текст, который отображается слева от индикатора выполнения. В этом случае этот текст говорит «Идет поиск». Вы можете увидеть текст на рисунке ниже.

Так выглядит индикатор выполнения.
Второй параметр — статус. Статус обычно отображает процент выполненной задачи. На рисунке выше видно, что на индикаторе выполнения отображается фраза «Завершено на 29%». Этот текст был помещен туда параметром Status.
Третий параметр — это параметр PercentComplete. Это параметр, который сообщает индикатору выполнения, как далеко продвинулась задача, чтобы PowerShell знал, сколько индикатора нужно отобразить.
Последняя строка скрипта — это строка Start-Sleep. Эта строка вводит задержку в 250 миллисекунд каждый раз, когда скрипт зацикливается. Эта задержка существует только для того, чтобы скрипт работал достаточно медленно, чтобы вы могли видеть индикатор выполнения на экране. В обычном сценарии вы обычно не вводите задержку.
Итак, с учетом сказанного, давайте посмотрим, как вы можете добавить индикатор выполнения в существующий скрипт. Некоторое время назад я написал простой скрипт, который считывал список виртуальных машин из CSV-файла, а затем использовал командлет Get-VM для отображения запрошенной виртуальной машины. Для демонстрации я добавил в этот скрипт индикатор выполнения. Вот как выглядит скрипт:
$List = Import-CSV C:ScriptsVMs.csv -Header 'Name' $TotalItems=$List.Count $CurrentItem = 0 $PercentComplete = 0 ForEach($VM в $List) { Write-Progress -Activity "Проверка Виртуальные машины" -Статус "$PercentComplete% Complete:" -PercentComplete $PercentComplete $Name = $VM.Name Get-VM -Name $Name $CurrentItem++ $PercentComplete = [int](($CurrentItem / $TotalItems) * 100) Start -Сон -Миллисекунд 2500 }Прежде чем я проведу вас по сценарию, позвольте мне показать вам вывод сценария.

Это то, что делает скрипт.
Первое, что вам нужно знать об этом выводе, это то, что я отредактировал снимок экрана для демонстрации. Обычно индикатор выполнения доходит до 100%, исчезает, а затем появляется вывод. Однако я сделал снимок экрана индикатора выполнения и объединил его со снимком экрана вывода, чтобы вы могли видеть все элементы. В реальной жизни индикатор выполнения и виртуальные машины не отображаются на экране одновременно.
Первая строка кода считывает список виртуальных машин из CSV-файла. Виртуальные машины хранятся в переменной с именем $List. Вторая строка создает переменную с именем $TotalItems. Эта переменная отражает общее количество элементов в $List (общее количество виртуальных машин). Я использую общее количество элементов позже при расчете процента.
Затем я создаю переменную с именем $CurrentItem. Он отражает, с каким элементом списка я работаю (виртуальная машина 1, виртуальная машина 2 и т. д.). Я также создал переменную с именем $PercentComplete и установил для нее значение 0, поскольку на данный момент скрипт еще не завершил никакой фактической работы.
Следующая строка определяет цикл. Здесь я создаю цикл For Each, который просматривает каждую виртуальную машину в $List виртуальных машин.
Первым шагом в цикле является отображение индикатора выполнения. Как вы можете видеть на предыдущем снимке экрана, я использую текст «Проверка виртуальных машин» вместе с процентом выполнения.
Следующая строка извлекает имя виртуальной машины из списка. В следующей строке используется командлет Get-VM, чтобы заставить Hyper-V отобразить некоторые основные сведения об указанной виртуальной машине.
Затем я увеличиваю число $CurrentItem на 1 ($CurrentItem++), а затем вычисляю процент выполненной задачи. Этот процент представляет собой просто текущее количество элементов, деленное на общее количество элементов (в данном случае виртуальных машин). Затем я умножаю все это на 100, чтобы оно отображалось в процентах, а не в виде десятичного числа. Затем я использую [int] для отображения результата в виде целого числа. Вы заметите на снимке экрана, что задача выполнена на 33%, а не на 33,333333%. Именно [int] приводит к тому, что процент выражается как целое число.
Наконец, я использую командлет Start-Sleep для введения задержки между каждой виртуальной машиной. Опять же, вам не нужно делать это в реальной жизни. Мне просто нужна была задержка, чтобы скрипт работал достаточно медленно, чтобы я мог получить снимок экрана индикатора выполнения.
Действительно замечательная вещь в работе с индикаторами выполнения в PowerShell заключается в том, что вы можете усложнять их, если хотите. PowerShell 7.2 позволит вам использовать escape-последовательности ANSI для настройки внешнего вида индикатора выполнения.