$349.78


$768.98


$53.28


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 2000 Pro: лучшая...
Когда я поинтересовался, может ли операционная система десятилетней давности типа Windows 98 по-прежнему быть жизнеспособным вариантом для использования на корпоративных настольных компьютерах,...
Подробнее...
Хакеры могут включить...
PandaLabs обнаружила Shark2 - утилиту для создания троянов, выложенную для продажи на нескольких интернет-форумах. Еe создатели уже выпустили несколько обновлений, поэтому фактически в сети...
Подробнее...
Java-приложение: заглянем...
Чтобы отладить приложение, можно поступить по-разному. Во-первых, можно воспользоваться штатным отладчиком из какого-либо программного пакета. Во-вторых, можно самостоятельно вычислить ошибку...
Подробнее...
Отправка по SMTP с...
1. Введение. Практически каждый, кто сталкивается с работой в инете на низком уровне при создании какой-либо почтовой программы, оповещалки, либо троя или кейлогера, напарывается на такой...
Подробнее...
доставка воды осуществляется тут
купить обручальное кольцо 585 здесь
Обзор вариантов прокладки...
Если кто-то пытается убедить вас, что создание сети — дело сложное, не верьте: на самом деле, оно очень сложное. Тем не менее, если не замахиваться сразу на масштаб промышленного предприятия,...
Подробнее...
Стратегии высокой надежности
Большинство предприятий среднего и большого бизнеса сегодня очень сильно зависят от своих компьютерных сетей. Многие предприятия также имеют приложения, которые являются ключевыми для задач...
Подробнее...
Службы Windows ХР
Важную роль в оптимизации производительности Windows XP может сыграть настройка системы служб. Управлять ими можно, вызвав оснастку управления службами через Пуск ->Выполнить-> services.msc....
Подробнее...
Реестр Windows
На смену ini-файлам, имеющим ряд концептуальных ограничений, еще в windows 3.1 было введено понятие реестра — регистрационной базы данных, хранящей различные настройки ОС и приложений. Изначально...
Подробнее...
Unix+ Samba + ftpd,...
Есть такая проблема: сложно найти ftpd, понимающий перекодировку имен файлов. Если хранить файлы на сервере в koi8, то ftpшник выдает винде крякозябры. Если хранить в CP1251, то ftp не передает...
Подробнее...
Несколько простых способов...
Задумывались ли вы когда-то о том, может ли ваш компьютер быть более быстрым? Мы рассмотрим несколько простых способов увеличить скорость работы, получив максимум производительности от своего...
Подробнее...