Ошибка: Failed to parse the Currency Converter XML document.
$2 464.99


Ошибка: Failed to parse the Currency Converter XML document.
$14 707.60


Ошибка: Failed to parse the Currency Converter XML document.
$778.13


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

Недавно мне пришлось писать довольно длинный и замысловатый сценарий 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.

Использование 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 просто предоставляет текущее значение процента и строку «% выполнено».

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

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

 

Интересное

Удалённое восстановление...
Как импортировать большой SQL-скрипт (дамп базы данных MySQL для форума phpBB), если обычными споcобами (загрузка через web-интерфейс phpMyAdmin, Backup cPanel) проблематична, особенно на модемном...
Подробнее...
Дюжина вопросов по...
Существуют несколько вопросов, которые изо дня в день повторяются на доске сообщений сервера ISAServer.org и в списках подписчиков. Эти же самые вопросы задают также в общих новостных лентах...
Подробнее...
Стандартные программы Windows
При установке операционной системы, по умолчанию ставится целый пакет стандартных программ Windows, о которых простому пользователю просто ничего не известно. На эти программы нет ярлыков, они...
Подробнее...
Создание web-проекта:...
После того, как определен состав работ, задачей руководителя проекта является определение конкретных функций и их наполнение людьми. Лица, назначаемые на выполнение задач, могут быть как штатными...
Подробнее...
http://import-sigaret.net/ американские сигареты самые хорошие сигареты.
26 способов получения...
Сентябрь 1999 года. Бред Табке пишет свои «26 шагов к достижению высокого трафика для сайта» в Мировом Форуме веб-мастеров. Статья имела очень много полезной информации для оптимизаторов сайтов....
Подробнее...
SSH - доступ. Crontab....
Закачивать сайт можно по протоколу FTP, соединяясь с сервером, где расположен ваш сайт, с помощью FTP-клиента. Но бывают ситуации, когда нужно отладить работу скрипта непосредственно на сервере...
Подробнее...
10 способов заставить...
Операционная система Windows Vista отличается повышенной функциональностью и безопасностью, а также имеет красивый стиль оформления пользовательского интерфейса Aero transparency, функцию...
Подробнее...
Службы Windows ХР
Важную роль в оптимизации производительности Windows XP может сыграть настройка системы служб. Управлять ими можно, вызвав оснастку управления службами через Пуск ->Выполнить-> services.msc....
Подробнее...
ASP. Работа с Internet...
Прогресс не стоит на месте, а движется вперед и в новых покалениях Windows уже имеются встроенные сервера для работы с ASP — это Internet Information Server (IIS). В этой статье мы...
Подробнее...
Предварительная загрузка...
Если у вас есть серия изображений для предзагрузки, то вы можете воспользоваться функцией preLoad, которую я написал для подобных ситуаций, которая проста в работе и не требует каких-либо...
Подробнее...