sergey vasin

The IT blog

Использование PowerShell Workflow для параллельного пинга компьютеров – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Приглашенный блогер Microsoft MVP Niklas Goude рассказывает о том, как, используя workflow, параллельно пинговать компьютеры, экономя тем самым значительное количество времени.

Предыдущие посты Niklas Goude можно найти здесь.

Командлет Test-Connection используется для отправки пакетов эхо-запроса ICMP(“ping”) одному или нескольким удаленным компьютерам.

Это простой и быстрый способ проверки, работают ли компьютеры.

Для пинга одного компьютера, вы просто можете набрать:

Test-Connection -ComputerName localhost

Командлет Test-Connection по умолчанию отправляет 4 эхо-запроса. Вы можете изменить это значение на 1, указав параметр Count:

Test-Connection -ComputerName localhost -Count 1

Попытка пропинговать отсутствующий компьютер приведет к ошибке:

Test-Connection -ComputerName blablabla -Count 1

Test-Connection : Testing connection to computer ‘blablabla’ failed: No such host is known

At line:1 char:1

+ Test-Connection -ComputerName blablabla -Count 1

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : ResourceUnavailable: (blablabla:String) [Test-Connection], PingException

    + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand

Если вы не хотите, чтобы сообщение об ошибке отображалось, вы можете установить параметр ErrorAction в значение SilentlyContinue (или использовать структуру Try/Catch для обработки ошибок):

Test-Connection -ComputerName blablabla -Count 1 -ErrorAction SilentlyContinue

Ошибка все еще происходит, просто не отображается на экране (вы можете отобразить ее, набрав $Errors[0]).

Теперь давайте предположим, что вы хотите протестировать подключение ко всем компьютерам в домене. Сначала вам нужно получить список всех компьютеров, используя командлет Get-ADComputer:

$computers = Get-ADComputer -Filter * | Select -ExpandProperty DNSHostName

Давайте посмотрим, сколько компьютеров в нашем домене:

$computers.Count

162

Если вам нужно пропинговать каждый из этих компьютеров, вы можете набрать следующую команду:

foreach ($computer in $computers) {

  Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue

}

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

Давайте выясним затрачиваемое командой время при помощи командлета Measure-Command:

Measure-Command -Expression {

  foreach ($computer in $computers) {

    Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue

  }

}

Days              : 0

Hours             : 0

Minutes           : 0

Seconds           : 39

Milliseconds      : 679

Ticks             : 396797893

TotalDays         : 0,000459256820601852

TotalHours        : 0,0110221636944444

TotalMinutes      : 0,661329821666667

TotalSeconds      : 39,6797893

TotalMilliseconds : 39679,7893

Заметьте, что для пинга всех компьютеров в сети требуется 39 секунд.

Для того, чтобы ускорить процесс, вы можете поместить этот код в WindowsPowerShellworkflow (рабочий процесс) и воспользоваться преимуществами конструкции foreach -parallel. Эта конструкция позволяет вам пинговать компьютеры параллельно.

workflow Test-WFConnection {

  param(

    [string[]]$Computers

  )

  foreach -parallel ($computer in $computers) {

    Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue

  }

}

Давайте посмотрим, сколько времени требуется workflowдля выполнения:

Measure-Command -Expression { Test-WFConnection -Computers $computers }

Days              : 0

Hours             : 0

Minutes           : 0

Seconds           : 7

Milliseconds      : 808

Ticks             : 78082448

TotalDays         : 9,03732037037037E-05

TotalHours        : 0,00216895688888889

TotalMinutes      : 0,130137413333333

TotalSeconds      : 7,8082448

TotalMilliseconds : 7808,2448

Нам потребовалось чуть больше 7 секунд. Разве не здорово!

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/20/use-powershell-workflow-to-ping-computers-in-parallel.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Декабрь 2, 2012 в 14:53

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s