Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - ограничить выполнение задачи по времени

Ответить
Настройки темы
PowerShell - ограничить выполнение задачи по времени

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Всем доброго времени суток, ранее на этом форуме, люди мне помогли с написанием скрипта, а точнее полностью написали его.
Скрипт парсер веб морд айпишек, берет диапазоны 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

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
все равно зависло, скрипт остановился. »
тут ничем не помогу, если виснет именно на iwr, у вас что-то с powershell не так... проверьте с другого компьютера
-timeout 3 означает то, что если даже не получен ответ, будет выдана ошибка через 3 секунды, а -ea 1 приводит к прерыванию по любой, возникающей ошибке в invoke-webrequest...
Кстати, условный блок с выводом информации в лог и командой return, надо вставлять там, где указал я, ибо в секции catch он будет работать только при ошибке, а там где показал я, он будет переходить к следующей итерации, сразу же, если не получен ответ (вернее content) от хоста...
А в catch, надо не заменить, а добавить только это:
Код: Выделить весь код
"Ошибка на $ip - $_"|out-file error.txt -enc utf8 -app
Цитата Griboed0ff:
стал писать дубли в результат »
дубли никак не связаны с этими добавлениями к коду... проверяйте все циклы...
для проверки добавьте такую строку:
Код: Выделить весь код
...
$ip =$_
$ip|out-file IP.txt -enc utf8 -app
...
и потом проверяйте дубли в файле...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 03-11-2020 в 12:07.


Отправлено: 11:59, 03-11-2020 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
не помогло на "10.16.17.130" все равно зависло, скрипт остановился.»
Попробуйте другой метод запроса:
Код: Выделить весь код
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:
Код: Выделить весь код
$a = (iwr $_ -timeout 3 -ea 1).content
»
Код: Выделить весь код
try{$a = iwr2 "http://$_" -timeout 3}
catch{"Не удалось выполнить запрос к $_"}

Отправлено: 02:56, 04-11-2020 | #12


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Fors1k:
Код: Выделить весь код
try{$a = iwr2 "http://$_" -timeout 3}
 catch{"Не удалось выполнить запрос к $_"}
»
Там есть уже try-catch...

-------
scio me nihil scire. Ѫ


Отправлено: 07:23, 04-11-2020 | #13


Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Там есть уже try-catch... »
Они разные.
Второй обрабатывает ошибку. Первый же ему ее передает.

Отправлено: 11:27, 04-11-2020 | #14


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Fors1k:
Они разные. »
В чем отличие?
Достаточно одного...
about_try_catch_finally

-------
scio me nihil scire. Ѫ


Отправлено: 13:04, 04-11-2020 | #15



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - ограничить выполнение задачи по времени

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход