Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...
OSzone.net Microsoft PowerShell Windows PowerShell: Отчет о ходе выполнения RSS

Windows PowerShell: Отчет о ходе выполнения

Текущий рейтинг: 3.91 (проголосовало 11)
 Посетителей: 6564 | Просмотров: 10832 (сегодня 0)  Шрифт: - +

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

что случайно вписал в него бесконечный цикл или какой-либо еще проблематичный элемент сценария.

Оболочка оставалась безмолвной, жалобно мигая своим маленьким курсором, и я спросил себя: "Жива ли она?" Как видно, у меня нет уверенности в себе, поскольку я поспешно нажал Ctrl+C, чтобы прервать сценарий. Пора добавить какую-никакую функцию сообщений о ходе работы.

Болтовня, болтовня, болтовня

Командлет месяца: Tee-Object

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

Get-WMIObject Win32_Service | Where { $_.State -ne "Running"  -and $_.StartMode -eq "Automatic" } | ForEach-Object { $_.Start() }  

На первый взгляд, кажется, что эта команда запускает все службы, установленные на автоматический запуск, но еще не запустившиеся по какой-либо причине. Однако на практике это не работает, и обнаружить причину может быть непросто, поскольку заглянуть в середину конвейера нельзя. Ну, нельзя, если не использовать Tee-Object.

Tee-Object перенаправляет объекты к файлу (либо внутрь переменной) и передает их по конвейеру. Например:

Get-WMIObject Win32_Service | Tee-Object AllServices.csv | Where   { $_.State -ne "Running" -and $_.StartMode -eq "Automatic" } |   Tee-Object FilteredServices.csv | ForEach-Object { $_.Start() }  

Это изменение позволяет мне увидеть, что происходит после каждой команды конвейера, и я могу быстро обнаружить, что мой файл FilteredServices.csv ничего не содержит! Ничего удивительного, что сценарий не работал! Немного дополнительной работы, и источник проблемы раскрыт – StartMode указан как "Auto", а не "Automatic", – а Tee-Object позволяет мне точно указать, где именно имела место проблема.


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

Write-Verbose "Test Message"

Те, кто попробовал, должны были заметить, что ничего не произошло. Это объясняется тем, что Write-Verbose отсылает объекты специальному конвейеру Verbose, который по умолчанию не отображает свои выходные данные. Этот конвейер контролируется встроенной переменной оболочки, $VerbosePreference. Значение этой переменной по умолчанию – SilentlyContinue, при котором подробный вывод не допускается. Однако после замены его на Continue конвейер открывается:

$VerbosePreference = "Continue"

Теперь я могу добавить пачку операторов Write-Verbose к моему сценарию и получить подробное представление того, что происходит в ходе его выполнения. Прелесть этого приема заключается в том, что по завершении тестирования и устранения неполадок я могу отключить всю эту дополнительную болтовню, установив $VerbosePreference обратно на SilentlyContinue в начале сценария.

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

Но мне нужен настоящий индикатор выполнения

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

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

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

К счастью, Windows PowerShellTM включает командлет Write-Progress. Этот командлет не предоставляет графического индикатора выполнения, подобного имеющемуся в Windows®, но неплохой индикатор выполнения он все же предоставляет, как показано на рис. 1. Он довольно похож на индикатор выполнения копирования файлов, используемый основанной на тексте частью программы установки в Windows Server® 2003 или даже Windows XP.

Рис. 1 Насколько выполнен сценарий? 

Использование Write-Progress требует некоторых объяснений. На самом деле, думаю лучше будет привести пример. Рассмотрим следующий сценарий:

for ($a=1; $a -lt 100; $a++) {    Write-Progress -Activity "Working..." `     -PercentComplete $a -CurrentOperation     "$a% complete" `     -Status "Please wait."    Start-Sleep 1  } 

Он использует Write-Progress для отображения индикатора выполнения. Я использовал Start-Sleep, чтобы заставить сценарий делать паузу на одну секунду при каждом проходе через цикл, чтобы его выполнение было достаточно медленным и мы могли увидеть процесс выполнения – без паузы цикл дошел был от 0 до 100 с такой скоростью, что индикатор выполнения лишь мелькнул бы ненадолго на экране.

Как можно увидеть, Activity («Действие»), которое я установил на Working («Работающее»), отображается на верху индикатора выполнения. Status («Состояние») показано прямо под ним, а CurrentOperation – внизу. Оболочка поддерживает только один индикатор выполнения за раз. При использовании Write-Progress либо будет создан новый индикатор выполнения, если текущий не отображается в настоящий момент, либо обновлен отображаемый.

Здесь я пока не сделал одной вещи – не указал индикатору исчезнуть по завершении. Для этого достаточно добавить к концу сценария следующее:

Write-Progress -Activity "Working..." `   -Completed -Status "All done."

Как правило, индикатор выполнения исчезнет сам по себе после завершения сценария, но если сценарию надо сделать что-то еще, то лучше скрыть его, после того, как он стал не нужен, – параметр -Completed просто удалит индикатор с экрана

Тик, тик, тик

Другое распространенное использование Write-Progress – создание счетчика "осталось секунд" вместо собственно индикатора выполнения. Приведу пример:

for ($a=100; $a -gt 1; $a--) {    Write-Progress -Activity "Working..." `     -SecondsRemaining $a -CurrentOperation     "$a% complete" `     -Status "Please wait."    Start-Sleep 1  } 

Все, что я здесь сделал, – это изменил цикл на отсчет со 100 до 1 и использовал параметр SecondsRemaining во Write-Progress, вместо PercentComplete. Результат показан на рис. 2. Как можно заметить, индикатор выполнения заменен на счетчик обратного отсчета. Оболочка автоматически преобразует общее число оставшихся секунд в часы, минуты и секунды, предлагая более удобную для пользователя информацию. Показанный здесь процент выполнения отсчитывается вниз от 100, просто потому, что это предоставленный мной параметр CurrentOperation. Реально процент выполнения не вычисляется, Windows PowerShell просто предоставляет текущее значение процента и строку «% выполнено».

Рис. 2 Сколько осталось до завершения выполнения сценария?

Сценарии, выдающие сообщения

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

Автор: Дон Джонс  •  Иcточник: TechNet Magazine  •  Опубликована: 20.03.2008
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:   Powershell, скрипты.


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.