|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - ограничить выполнение задачи по времени |
|
PowerShell - ограничить выполнение задачи по времени
|
Старожил Сообщения: 211 |
Всем доброго времени суток, ранее на этом форуме, люди мне помогли с написанием скрипта, а точнее полностью написали его.
Скрипт парсер веб морд айпишек, берет диапазоны ip (больше 2000 диапазонов) с файла по 20 штук, пингует их, те что пингуются пробует спарсить инфу с айпишек, пишет в файл. Встретился с проблемой, что некоторые айпишки пингуются, но получение информации с аппарата никогда не заканчивается, ну и далее срипт перестает сканировать сети, в общем зависает, при этом ошибок никаких не пишет. Да и бывают другие устройства с веб мордами, но тут уже ошибки пишет и не останавливается, не страшно. Подумал может чего прописать в catch, но идей не пришло. Единственное, что пришло в голову это прописать ограничение по времени выполнения задачи. То есть, если инфа не получена за 5-10 секунд, то пропустить данный адрес, перейти к следующему. Может у кого есть идеи как решить проблему или воплотить мою?! скрипт
param ( #[parameter(Mandatory=$true)] [string]$outfile = 'C:\results\phone.csv', $enc1 = 65001, $enc2 = 28591, [int[]]$SelectTable = 1, #[parameter(Mandatory=$true)] [String]$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ) #---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------ # Установка дополнительного модуля PowerHTML, для независимого парсинга HTML # Может потребоваться ручное подтверждение установки. if (!(get-module -list powerhtml)) { write-verbose "Installing PowerHTML module for the current user..." install-module powerhtml #-scope currentuser } #----------------------------------------------------------------------------------------- function convert ($from, $to){ begin{ $fenc = [text.encoding]::getencoding($from) $tenc = [text.encoding]::getencoding($to) } process{ $a = $tenc.getbytes($_) $fenc.getstring($a) } } [net.servicepointmanager]::securityprotocol = 0 [array]$arr = gc 'C:\scripts\phone\all_ip.txt' $ips = 65..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort if ([string]::isnullorempty($selecttable)){ $number = 0 } else {$number = $selecttable} $x = 0 for ($i =20; $i -le ($ips.count - 1); $i += 20) # по 20 адресов { $ips[$x..$i] | foreach -parallel { if (test-connection $_ -count 1 -q -timeout 1){ try { $ip = $_ $a = (iwr $_).content $content = if ($a -match [char]208){ if ($a -match 'windows-1251'){ $enc1,$enc2 = 1251,1252 $a|convert $enc1 $enc2 } else {$a|convert $using:enc1 $using:enc2} } else {$a} $html = [net.webutility]::htmldecode($content)|convertfrom-html [array]$tables = $html.selectnodes('//table') # Исключение вложенных таблиц: $tables = $tables|?{$_.selectnodes('.//table') -eq $null} $tbl = $tables[$using:number]|%{$n=0}{ $tr = $_.selectnodes('.//tr') $headers = @() if ($headers = $_.selectnodes('.//th')){ $headers = ($headers|select -exp innertext).trim() } else { $headers = 1..([linq.parallelenumerable]::max( [linq.parallelenumerable]::asparallel( ($tr|%{$_.selectnodes('.//td').count}) ) ))|%{"H$_"} } $rowind = ,1 * $headers.count $tr|?{$_.selectnodes('.//td') -ne $null}|%{ $row = $_.selectnodes('.//td')|%{ $attr = $_.attributes if ($attr){ $rowspan = ($attr|? name -eq 'rowspan').value $colspan = ($attr|? name -eq 'colspan').value } [pscustomobject]@{ 'InnerText' = $_.innertext 'RowSpan' = if($rowspan){[int]$rowspan} else {1} 'ColSpan' = if($colspan){[int]$colspan} else {1} } } $str = [ordered]@{} $k=0 foreach ($item in $row) { if ($rowind[$k] -gt 1){ while ($rowind[$k] -gt 1) { $str[$headers[$k]] = $null $rowind[$k] -= 1 $k++ } } if (($colspan = $item.colspan) -gt 1) { $str[$headers[$k]] = if ($item.innertext) { $item.innertext.trim() } else {$null} if ($item.rowspan -gt 1) {$rowind[$k] = $item.rowspan} $k++ while ($colspan -gt 1) { $str[$headers[$k]] = $null $colspan -=1 if ($rowind[$k] -gt 1) {$rowind[$k]-=1} $k++ } } else { $str[$headers[$k]] = if($item.innertext){ $item.innertext.trim() } else {$null} if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan} $k++ } } [pscustomobject]$str } } $parr1 = $tbl.h1 if ($tbl.h2 -ne $null) {$parr2 = $tbl.h2} else {$parr2 = $tbl.h3} [pscustomobject]@{ 'IP' = $_ 'MAC-адрес' = if ([array]::indexof($parr1,'MAC-адрес') -ne -1) { $parr2[([array]::indexof($parr1,'MAC-адрес'))] } else {$parr2[([array]::indexof($parr1,'MAC Address'))]} 'Номер телефона' = if ([array]::indexof($parr1,'Номер телефона') -ne -1) { $parr2[([array]::indexof($parr1,'Номер телефона'))] } elseif ([array]::indexof($parr1,'Номер телефона 1') -ne -1) { $parr2[([array]::indexof($parr1,'Номер телефона 1'))] } else { $parr2[([array]::indexof($parr1,'Phone DN'))] } 'Серийный номер' = if ([array]::indexof($parr1,'Серийный номер') -ne -1) { $parr2[([array]::indexof($parr1,'Серийный номер'))] } else {$parr2[([array]::indexof($parr1,'Serial Number'))]} 'Номер модели' = if ([array]::indexof($parr1,'Номер модели') -ne -1) { $parr2[([array]::indexof($parr1,'Номер модели'))] } else {$parr2[([array]::indexof($parr1,'Model Number'))]} } } catch { write-host Ошибка: $ip - $_ -for red } } } -throttlelimit 100 | export-csv $outfile -notype -enc utf-8 -d ';' -append $x = $i + 1 } Copy-item -Path $outfile -Destination "C:\Base" -Force |
|
Отправлено: 12:46, 16-10-2020 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
-timeout 3 означает то, что если даже не получен ответ, будет выдана ошибка через 3 секунды, а -ea 1 приводит к прерыванию по любой, возникающей ошибке в invoke-webrequest... Кстати, условный блок с выводом информации в лог и командой return, надо вставлять там, где указал я, ибо в секции catch он будет работать только при ошибке, а там где показал я, он будет переходить к следующей итерации, сразу же, если не получен ответ (вернее content) от хоста... А в catch, надо не заменить, а добавить только это: Цитата Griboed0ff:
для проверки добавьте такую строку: и потом проверяйте дубли в файле... |
||
------- Последний раз редактировалось YuS_2, 03-11-2020 в 12:07. Отправлено: 11:59, 03-11-2020 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 193
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
function iwr2($uri,$timeout){ [void][Reflection.Assembly]::LoadWithPartialName("System.Net.Http") $net=[Net.Http.HttpClient]::new() $net.Timeout=[timespan]::FromSeconds($timeout) try { $r=$net.getAsync($uri) $r.Result.Content.ReadAsStringAsync().Result } catch [Net.WebException] { throw $_ } finally{ if($net){$net.Dispose()} } } Цитата Griboed0ff:
|
||
Отправлено: 02:56, 04-11-2020 | #12 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата Fors1k:
|
|
------- Отправлено: 07:23, 04-11-2020 | #13 |
Старожил Сообщения: 193
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Второй обрабатывает ошибку. Первый же ему ее передает. |
|
Отправлено: 11:27, 04-11-2020 | #14 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 13:04, 04-11-2020 | #15 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Выполнение команд в бат в зависимости от времени запуска | Sergey.l | Скриптовые языки администрирования Windows | 8 | 06-02-2018 00:15 | |
CMD/BAT - Выполнение задачи со сдвигом. | krasavchik0 | Скриптовые языки администрирования Windows | 8 | 17-10-2017 20:11 | |
CMD/BAT - Скрытое выполнение задачи через hidcon | LightSoul | Скриптовые языки администрирования Windows | 1 | 13-09-2017 13:57 | |
PowerShell - [решено] Выполнение команды в указанный только промежуток времени | rudimko | Скриптовые языки администрирования Windows | 5 | 28-01-2014 00:38 | |
VBA - [решено] Выполнение кода через определенный промежуток времени | Dark_Timur | Программирование и базы данных | 2 | 03-07-2012 00:18 |
|