Всем доброго времени суток! Есть некий скрипт, кстати написанный на этом же форуме. Данный скрипт - парсер веб страниц устройств. Проблема данного скрипта в том, что он достигает результата только после второго запуска. Например: я включил пк, запустил скрипт, результата нет, я запускаю его еще раз, результат есть. После первого прохождения отрабатывает нормально всегда, до перезагрузки, после перезагрузки нужно снова запускать один холостой и снова все нормально. Если посмотреть на код, то видно, что он перебирает поочередно ip в заданном диапазоне и пробует спарсить контент. Ранее в этом скрипте был предварительный пинг, но этот самый пинг настолько увеличивает длительность сканирования, что было решено его убрать. Без пинга работает намного быстрее, но со второго раза. Пробовал увеличить таймаут парсера до 10, не помогло. Как понять где подвох непонятно.
Сам скрипт
Скрытый текст
Код:
param (
#[parameter(Mandatory=$true)]
[string]$outfile = "путь\1.csv",
$enc1 = 65001,
$enc2 = 28591,
[int[]]$SelectTable = 1
)
# Remove-Item -Path $outfile -ErrorAction Ignore
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
$ips = 129..150 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|sort
$ips|%{
try {
$a = $null
$a = (iwr $_ -timeout 1 -ea 1).content
#$a = gc $_ -raw -enc utf8
$content = if ($a -match [char]208){
if ($a -match 'windows-1251'){$enc1,$enc2 = 1251,1252}
$a|convert $enc1 $enc2
} else {$a}
$html = [net.webutility]::htmldecode($content)|convertfrom-html
[array]$tables = $html.selectnodes('//table')
# Исключение вложенных таблиц:
$tables = $tables|?{$_.innerhtml -notmatch 'table'}
if ([string]::isnullorempty($selecttable)){
$number = 0..($tables.count-1)
} else {$number = $selecttable}
$tbl = $tables[$number]|%{$n=0}{
$tr = if($_.element('tbody')){
$_.element('tbody').elements('tr')
} else {$_.elements('tr')}
$headers = @()
if($headers = $tr|?{$_.element('th') -ne $null}|
%{$_.elements('th')}|select -exp innertext){
$headers=$headers.trim()
} else {
$headers = 1..(
[linq.parallelenumerable]::max(
[linq.parallelenumerable]::asparallel(($tr|
%{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
)
)|%{"H$_"}
}
$rowind = ,1 * $headers.count
$tr|?{$_.elements('td') -ne ''}|%{
$row = $_.elements('td')|? innertext -ne ''|%{
$attr = $_.attributes
if ($attr){
$rowspan = ($attr|? name -eq 'rowspan'|select value).value
$colspan = ($attr|? name -eq 'colspan'|select value).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
}
}
[pscustomobject]@{
'IP' = $_
'MAC-адрес' = if ([array]::indexof($tbl.h1,'MAC-адрес') -ne -1){
$tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
} else {$tbl[([array]::indexof($tbl.h1,'MAC Address'))].h2}
'Номер телефона' = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
} elseif ([array]::indexof($tbl.h1,'Номер телефона 1') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
} else {
$tbl[([array]::indexof($tbl.h1,'Phone DN'))].h2
}
'Серийный номер' = if ([array]::indexof($tbl.h1,'Серийный номер') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
} else {$tbl[([array]::indexof($tbl.h1,'Serial Number'))].h2}
'Номер модели' = if ([array]::indexof($tbl.h1,'Номер модели') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
} else {$tbl[([array]::indexof($tbl.h1,'Model Number'))].h2}
}
write-host $_ phone information received -for Green
} catch { write-host -for red | Clear-Host }
write-host $_ -for red
} |export-csv $outfile -notype -enc utf8 -d ';' -append