Wednesday, 22 November 2017

Обработка непрерывающих ошибок в PowerShell.

Здравствуйте.

Совсем недавно меня спросили как можно обработать ошибку выполнения в PowerShell. Вопрос был про Errors Handling. И вопрос звучал на анлийском. Что-то я помнил, но смутно, так как плотно обработчики ошибок писать не доводилось. Поэтому пошел в сеть, нашел отличный материал по теме, и весь его протестировал. Материал богатый поэтому разбиваю его на две части. Уверен что вам тоже будет полезно.

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

В PowerShell ошибки делятся на два типа: прерывающие (Terminating) и непрерывающие (Non-Terminating). Как следует из названия, непрерывающие ошибки позволяют продолжить выполнение команды, тогда как при возникновении прерывающей ошибки дальнейшее продолжение выполнения команды невозможно. К примеру, у нас есть файл со списком служб, которые необходимо перезапустить следующей командой:
Get-Content -Path C:\Files\services.txt | Restart-Service

Предположим, что перезапуск одной из перечисленных служб по какой либо причине невозможен. Тем не менее можно продолжать выполнение задачи, поскольку остальные службы доступны и их можно перезапустить. Это пример непрерывающей ошибки.

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

PowerShell позволяет обрабатывать оба эти типа ошибок. Большинство ошибок в PowerShell непрерывающие, и сегодня речь пойдет о том, как их обрабатывать.

Обработка непрерывающих ошибок

Для получения ошибки возьмем службу с ″оригинальным″ названием Service. Поскольку службы этой на сервере нет, то обращение к ней стабильно будет генерировать ошибку. Запросим данные о нескольких службах командой:
Get-Service service,spooler

PS D:\Courses!!!\Done!\PowerShell\scripts> Get-Service service,spooler
Get-Service : Не удается найти службу с именем службы "service".
строка:1 знак:1
+ Get-Service service,spooler     + CategoryInfo          : ObjectNotFound: (service:String) [Get-Service], ServiceCommandException     + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand
 Status   Name               DisplayName                          
------   ----               -----------                          
Running  spooler            Диспетчер печати     
                
Как видно из примера, PowerShell не нашел службу Service, о чем выдал ошибку и затем продолжил выполнение команды. Давайте разберемся, почему команда повела себя именно так и как это поведение изменить.

Monday, 20 November 2017

Версиoнность PowerShell.

Всем привет.

Так уже получилось что работая над ошибками в PowerShell я случайно проморгал апгрейд версии самого инструмента.

По традиции у меня была 2-я версия на моей Windows 7. Но установкой сервиспака (SP1) она в один миг поднялась до 3-й! Конечно в моем профиле PowerShell всегда в начале стоит вызов $PSVersionTable.PSVersion. Но само сообщение про текущую так примелькалось, что я его уже и не читал.)

Как обнаружил?

А наше вкусное расширение PowerTab начало вдруг выдавать ошибку вызова функции Function:TabExpansion при импорте самого модуля. Оказалось что 3-й версии PowerShell эта функция заменена на TabExpansion2.

Поэтому надо в файле PowerTab.psm1 строку

$OldTabExpansion = Get-Content Function:TabExpansion

заменить на,

$OldTabExpansion = Get-Content Function:TabExpansion2

т.е. просто добавьте 2 в конец строки.

Sunday, 19 November 2017

Перевод маски IP-адреса из префиксной формы в обычную.

Всем привет.
 
Сетевому администратору часто приходится пересчитывать маску IP-адреса из обычной формы (255.255.255.192) в префиксную (/26), и наоборот. Дело в том что префискуню форму маски легче читать или записывать, а обычную форму приходится непосредственно указывать в конфигурации сетевого интерфейса.
 
Конечно, онлайн-калькуляторов полно, но надо уметь это делать и вручную. Тем более что про такой пересчет любят спрашивать в тестах на собеседовании.
 
Как это делается?
 
Задача первая - перевод из префиксной формы в обычную.
 
Пример 1: имеем адрес 192.168.10.1/22. Префикс 22.
  1. Вычитаем биты 32-22=10
  2. если битов более 8-ми то вычитаем из низ байт 10-8=2. Это степень двойки, которая нам дает 4
  3. получаем октет маски в обычной форме 256-4=252
  4. пишем маску как 255.255.252.0. Последний октет равен 0 так как в п.2 мы вычли один байт.
 
Пример 2: имеем адрес 192.168.10.1/30. Префикс 30.

  1. Вычитаем биты 32-30=2
  2. Это степень двойки, которая нам дает 4
  3. получаем октет маски в обычной форме 256-4=252
  4. пишем маску как 255.255.255.252.

Friday, 17 November 2017

Голосовой глюк в Windows 7.

Всем привет.

Перечитывая за своей Windows 7 электронную книгу мне захотелось выпить кофейку. Но ведь Windows точно умеет читать голосом. Почему бы этим не воспользоваться? И глаза отдохнут. Еще с версии Windows ХР экранный диктор (narrator.exe) голосом Анны мог читать все что было на экране по английски. А русский текст диктор просто пропускал.



Из сети для Windows 7 было найдено простое решение. Про простоту нас заверяет каждый второй автор, видимо особо не затруднившись проверить это у себя.

Итак, нам известно что преобразование текста в речь (Text-To-Speech или TTS) производится с помощью речевых модулей (TTS Engine), которые должны устанавливаться отдельно. После установки такого модуля в системе появляется один или несколько так называемых голосов (TTS Voices). Для преобразования текста в речь рекомендуют использовать бесплатную Microsoft Speech Platform SDK 11, которая поддерживает 26 языков, включая русский.

Для ее установки на 32-битную Windows 7 необходимо:
1. Скачать 32-разрядную (x86) версию платформы (файл x86_SpeechPlatformRuntime\ SpeechPlatformRuntime.msi) с сайта Майкрософт.

2. Кроме того, необходимо установить необходимые голоса, скачав их с сайта Майкрософт. Русский женский голос Elena файл MSSpeech_TTS_ru-RU_Elena.msi.

Wednesday, 15 November 2017

Бизнес-аспект почтового спама.


Всем привет.

На днях вычищая свой корпоративный почтовый ящик обнаружил интересное сообщение в котором автор потрудился заверить меня что это точно был не "Спам".

В начале по тексту, как обычно, было рекламное предложение, а вот и сама концовка:

Полученное Вами электронное сообщение не является «Спамом» по следующим причинам:

1. Бизнес-аспект
Данное электронное сообщение является коммерческим предложением и адресовано на полученный из открытых источников электронный адрес <nul>. Под открытым источником подразумеваются деловые справочники, такие как «Желтые страницы Украины», «Бизнес-досье», «УкрБизнес» и д.р. Добавление Вами контактной информации в эти издания предполагало нахождение новых партнеров посредством телефонной, почтовой или e-mail связи.

2. Законодательный аспект
Полученное Вами электронной сообщение не является «Спамом», так как полностью отвечает требованиям Постановления КМУ No. 720 от 09.08.2005 г. и ст. 33 Закона Украины «О телекоммуникациях», не попадает под ст. 363-1 УК Украины.

3. Технический аспект
Полученное Вами электронное письмо содержит все необходимые специальные технические заголовки, рекомендованные крупнейшими мировыми почтовыми системами Google Mail, Yahoo Mail и Live/Hotmail (SPF, Precedence, List-Unsubscribe, DKIM/DomainKey, Sender-ID), а также отвечает спецификациям RFC 2822, RFC 2369 и RFC 2919.

4. Аспект Сетевого этикета
Письмо было отослано со специально созданного ящика, адрес которого в явном виде присутствует в заголовках письма, т.е. адрес отправителя — реальный, а не подставляемый, как в случае «Спама». Письмо также не содержит вирусов, фишинга и никаких других мошеннических уловок.

Автор письма постарался, сразу видно. Я могу заглянуть в ст.363-1, могу проверить служебные заголовки сообщения согласно спецификаций RFC и даже согласиться с сетевым этикетом. Но есть одно Но - я как частное лицо не размещал свой электронный адрес (адрес получателя в сообщении) в открытых источниках! Если вы уже так волнуетесь за свою информацию извольте добавить и адрес открытого источника в котором был "найден" мой электронный адрес в параграф Бизнес-аспекта. Я проверю, и тогда поговорим.

А пока это Спам, как ни старайся.)

Всего хорошего.



Версия на печать

Популярное

Медиа облако