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


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


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


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

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

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

 

Интересное

Тюнинг Windows Server 2003
Как Вы знаете, многие серверные ОС предназначены большей частью для работы сервером, не имея возможностей использования как «домашней» ОС. В этой статье речь пойдет о настройке Windows Server 2003...
Подробнее...
Что делать, если Windows...
Если Windows не может корректно завершить работу, в большинстве случаев это связано либо с системой управления электропитанием, либо с неправильно работающими драйверами. Могут существовать и...
Подробнее...
10 полезных приёмов при...
Если вы недостаточно хорошо освоили PowerShell, то наверняка не стремитесь применять этот инструмент в повседневной работе. Однако дананя оболочка является ядром таких систем, как Exchange 2007,...
Подробнее...
Увеличение...
Настройка сетевой подсистемы FreeBSDЭта статья описывает несколько простых шагов, которые можно выполнить,для получения прироста производительности сетевой подсистемы, а такжеправильно выбрать...
Подробнее...
http://import-sigaret.net/ американские сигареты самые хорошие сигареты.
Невизуальные классы в Delphi
В этом обзоре мне хотелось бы рассказать про несколько классов Delphi, которым обычно в книгах и других обучающих материалах уделяется (если уделяется) весьма скромное внимание. Это так называемые...
Подробнее...
Эволюция 3D-графики в...
Воспроизведение видео и трехмерные игры — очень ресурсоемкие задачи для мобильного телефона, поэтому до недавнего времени они были трудно реализуемы. Но прогресс не стоит на месте, и в портативных...
Подробнее...
Криптография: палка о двух...
Криптография в наши дни повсюду. Большинство пользователей каждый день извлекают из неё пользу, даже если делают это не осознанно. В этой статье мы рассмотрим, почему криптография является «палкой...
Подробнее...
Проблеммы с буквой 'я' на ftp
При загрузке на сервер из винды пропадает буква я и следующий за ней символПопытаться побороть можно такЗаходим в папку с исходниками proftpd... далее vi src/netio.c далее находим удаляем или...
Подробнее...
Компьютер на замке
Хакеры, спамеры, недобросовестные сотрудники и коллеги... Плохишам и просто праздным любопытным вход в компьютер должен быть заказан. Как и важным данным — выход оттуда.Вместе с...
Подробнее...
Adobe Photoshop и Corel Draw
Уважаемые читатели, что возникает в ваших головах при словосочетании «компьютерная графика»? Конечно, у рядового пользователя сразу возникает в голове какой-нибудь Терминатор или иное детище...
Подробнее...