Войти

Показать полную графическую версию : вытянуть информацию из html полученного через curl


Страниц : 1 2 3 4 5 [6] 7 8

Griboed0ff
08-05-2020, 12:09
-есть проверка существования хостов и если они не отвечают, то в массив не должны попадать... »
Убрал первую проверку пингом и дело пошло быстрее намного. param (
#[parameter(Mandatory=$true)]
[string]$outfile = 'C:\Users\svushak2\Desktop\all_phone.csv',
$enc1 = 65001,
$enc2 = 28591,
[int[]]$SelectTable = 1
)

#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля 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 = 'ssl3,tls,tls11,tls12'
[array]$arr = gc 'C:\Users\svushak2\Desktop\all_ip.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

$ips|%{
if (test-connection $_ -count 1 -q){
try {
$a = (iwr $_).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}
}
} catch {
write-host Ошибка: $_ -for red
}
}
} |export-csv $outfile -notype -enc utf8 -d ';' -append Интересно если вообще пинг убрать, то еще быстрее будет?

Может пошик умеет пинговать многопоточно? а то получается большой объем когда скрипту даешь, то это надолго и непонятно когда он закончит, потому что из списка подсетей пингует не по порядку как в файле, а в каком-то своем порядке, а так было бы понятно по результату хотя бы.

скормил скрипту 2500 подсетей, уже неделю файл заполняет, но заполняет :)

YuS_2
08-05-2020, 16:55
Интересно если вообще пинг убрать, то еще быстрее будет? »
если его убрать, то будут ошибки... выше Вы сами о них сообщали.

Кстати, код я немного изменил, в этой части:
$ips|%{
if (test-connection $_ -count 1 -q){
try {
$a = (iwr $_).content
$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|?{$_.selectnodes('.//table') -eq $null}
$tbl = $tables[$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 Ошибка: $_ -for red
}
}
} |export-csv $outfile -notype -enc utf8 -d ';' -append
- возможно, скорости не прибавит, но так будет правильнее...

Может пошик умеет пинговать многопоточно? »
можно ранспейсы (https://devblogs.microsoft.com/scripting/beginning-use-of-powershell-runspaces-part-1/) задействовать, но это целиком скрипт придется запускать в фоне, т.е. выходные файлы будут разными...
можно попробовать использовать workflow с конструкцией foreach -parallel (...){...}, примерно так:
ForEach -Parallel ($<item> in $<collection>)
{
[<Activity1>]
[<Activity2>]
...
}
где, команды будут выполняться параллельно, но коллекция перебирается последовательно...
В общем, простор для творчества есть...

Foreigner
08-05-2020, 17:31
попробовать использовать workflow »

Ну или ставить PowerShell Core (7), там это уже внедрили.

ForEach-Object -Parallel
-ThrottleLimit [int] # Количество потоков
-TimeoutSeconds [int] # Задержка, чтобы успел войти весь $input

YuS_2
08-05-2020, 18:03
Ну или ставить PowerShell Core (7), там это уже внедрили. »
Да, это кстати, как раз, упрощенное использование runspace...

Iska
08-05-2020, 23:43
Foreigner, а реально там как — хост пользует несколько ядер единовременно?

Foreigner
09-05-2020, 01:06
а реально там как — хост пользует несколько ядер единовременно? »

Если честно, не знаю. Но прирост производительности наглядный, например пинг ускоряется в три раза. Но в справке (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7) написано, что -parallel не для всего подходит. Нужно выяснять путем тестирования.

Например простой перебор чисел 0..1000 значительно медленнее обычного foreach.

YuS_2
09-05-2020, 08:12
Foreigner, Iska,
хост пользует несколько ядер единовременно? »
https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/

Iska
09-05-2020, 08:27
YuS_2, спасибо, ясно. Ответ — да:
…if the machine you are running on has multiple cores that can host the script block threads. In this case the -ThrottleLimit parameter should be set approximately to the number of available cores.

Griboed0ff
09-05-2020, 08:32
Кстати, код я немного изменил, в этой части: »
не смогу проверить пока срипт не переберет 2500, паузы то нет.
Сейчас гляну смогу ли поднять на рабочей тачке пошик 7.

поставил, готов к тестам. PowerShell 7.0.0
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/powershell
Type 'help' to get help.

PS C:\Program Files\PowerShell\7>

Я так понимаю надо будет указывать количество ядер или автоматически выставится? а так 4 ядра (i5-4590s).

YuS_2
09-05-2020, 11:34
готов к тестам. »
попробуйте так проверить:
...
$ips|% -parallel {
if (test-connection $_ -count 1 -q -timeout 1){
try {
$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 Ошибка: $_ -for red
}
}
} -throttlelimit 5 |export-csv $outfile -notype -enc utf8 -d ';' -append
- пинги будут выполняться чуть быстрее за счет -timeout 1
Количество одновременно выполняющихся сценариев, регулируйте параметром -throttlelimit 5

Foreigner
09-05-2020, 12:01
поставил, готов к тестам. »

Только учтите, что по умолчанию PowerShell 7 работает с UTF8, поэтому скрипты с кириллицей должны быть в этой кодировке.

# pwsh $OutputEncoding

Preamble :
BodyName : utf-8
EncodingName : Unicode (UTF-8)
HeaderName : utf-8
WebName : utf-8
WindowsCodePage : 1200
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
IsSingleByte : False
EncoderFallback : System.Text.EncoderReplacementFallback
DecoderFallback : System.Text.DecoderReplacementFallback
IsReadOnly : True
CodePage : 65001

# powershell $OutputEncoding

IsSingleByte : True
BodyName : us-ascii
EncodingName : US-ASCII
HeaderName : us-ascii
WebName : us-ascii
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : True
IsMailNewsSave : True
EncoderFallback : System.Text.EncoderReplacementFallback
DecoderFallback : System.Text.DecoderReplacementFallback
IsReadOnly : True
CodePage : 20127


На эту тему, можно почитать тут (https://stackoverflow.com/questions/40098771/changing-powershells-default-output-encoding-to-utf-8)

YuS_2
09-05-2020, 13:48
Только учтите, что по умолчанию PowerShell 7 работает с UTF8 »
Да, к тому же, utf8, в powershell core необходимо именовать utf-8...
По рукам бы надавать за такую вот "совместимость", этим индусам... :)

Griboed0ff
09-05-2020, 14:00
попробуйте так проверить: » param (
#[parameter(Mandatory=$true)]
[string]$outfile = 'D:\PowerShell\готовые\all_phone.csv',
$enc1 = 65001,
$enc2 = 28591,
[int[]]$SelectTable = 1
)

#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля 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 = 'ssl3,tls,tls11,tls12'
[array]$arr = gc 'D:\PowerShell\готовые\all_ip.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

$ips|% -parallel {
if (test-connection $_ -count 1 -q -timeout 1){
try {
$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 Ошибка: $_ -for red
}
}
} -throttlelimit 4 |export-csv $outfile -notype -enc utf8 -d ';' -appendPS C:\Windows\System32> D:\PowerShell\готовые\phone_p7.ps1
SetValueInvocationException: D:\PowerShell\готовые\phone_p7.ps1:28
Line |
28 | [net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception setting "securityprotocol": "The requested security protocol is not supported."

ForEach-Object: D:\PowerShell\готовые\phone_p7.ps1:32
Line |
32 | $ips|% -parallel {
| ~~~~~~~~~~~~~
| The value of the using variable '$using:number' cannot be retrieved because it has not been set in the local
| session.

PS C:\Windows\System32>

похоже надо доустановить, щас решу отпишусь.

Griboed0ff
09-05-2020, 14:56
Ни на одном компе не работает.

Foreigner
09-05-2020, 16:04
не работает »

По поводу строки 28:

[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'

Её лучше закомментировать. Она в pwsh не работает, у меня тоже самое в другом скрипте (обновление Far)


$using:number


По идее переменная $number должна быть определена до начала цикла foreach-object, Например $enc1 и $enc2 определены в параметрах и не вызывают ошибки. Где $number вообще назначается? Что-то не вижу.

YuS_2
09-05-2020, 18:34
похоже надо доустановить »
не надо...
Про строку 28 уже написали...
А по поводу $using:number - ранее, переменная определялась внутри цикла foreach-object (что неправильно), а теперь я вынес её за пределы цикла.
В общем, надо добавить перед циклом:
...
if ([string]::isnullorempty($selecttable)){
$number = 0
} else {$number = $selecttable}
$ips|% -parallel {
...

Griboed0ff
09-05-2020, 19:06
В общем, надо добавить перед циклом: »
param (
#[parameter(Mandatory=$true)]
[string]$outfile = 'D:\PowerShell\готовые\all_phone.csv',
$enc1 = 65001,
$enc2 = 28591,
[int[]]$SelectTable = 1
)

#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля 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 = 'ssl3,tls,tls11,tls12'
[array]$arr = gc 'D:\PowerShell\готовые\all_ip.txt'
$ips = 2..254 |%{$n=$_;$arr|%{"$_"+$n}}|sort

if ([string]::isnullorempty($selecttable)){
$number = 0
} else {$number = $selecttable}
$ips|% -parallel {
if (test-connection $_ -count 1 -q -timeout 1){
try {
$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 Ошибка: $_ -for red
}
}
} -throttlelimit 4 |export-csv $outfile -notype -enc utf8 -d ';' -appendPS C:\Windows\System32> D:\PowerShell\готовые\phone_p7.ps1
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Недопустимый параметр: 28591
ConvertFrom-Html:
Line |
11 | … $html = [net.webutility]::htmldecode($content)|convertfrom-html
| ~~~~~~~~~~~~~~~~
| Cannot bind argument to parameter 'Content' because it is null.
Ошибка: You cannot call a method on a null-valued expression.
Ошибка: You cannot call a method on a null-valued expression.
Ошибка: You cannot call a method on a null-valued expression. файл заполнился нормально, но IP MAC-адрес Номер телефона Серийный номер Номер модели


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

Griboed0ff
09-05-2020, 19:23
скормил файлик с подсетями побольше PS C:\Windows\System32> D:\PowerShell\готовые\phone_p7.ps1
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: You cannot call a method on a null-valued expression.
Ошибка: Response status code does not indicate success: 500 (Internal Server Error).
Ошибка: You cannot call a method on a null-valued expression.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка:
Service Unavailable

Service Unavailable
HTTP Error 503. The service is unavailable.


Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: Exception calling "IndexOf" with "2" argument(s): "Value cannot be null. (Parameter 'array')"
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка: You cannot call a method on a null-valued expression.
Ошибка: Response status code does not indicate success: 404 (Not Found).
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
Ошибка:
Service Unavailable

Service Unavailable
HTTP Error 503. The service is unavailable.


Ошибка: Exception calling "IndexOf" with "2" argument(s): "Value cannot be null. (Parameter 'array')"
Ошибка: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
Ошибка: 401 Unauthorized

Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.

Видимо 7 пошик и ошибки пишет другие

YuS_2
09-05-2020, 19:37
Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение. »
это из блока try-catch, т.е. пинг проходит, а (iwr $_).content - с ошибкой... проверьте вручную.

Недопустимый параметр: 28591 »
Проверьте, есть ли такие цифры в перечне:
[text.encoding]::getencodings()

файл заполнился нормально, но »
Хмм...
utf8 »
А вот тут, читали:
Да, к тому же, utf8, в powershell core необходимо именовать utf-8... »
? Надо исправить... и сам скрипт сохраняйте в utf-8

жаль ограничено количеством ядер. »
Не ограничено, можно использовать и большее число... поэкспериментируйте.

Griboed0ff
09-05-2020, 19:45
Да, к тому же, utf8, в powershell core необходимо именовать utf-8. » сохранял в utf-8. Что имеете ввиду "именовать"?

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




© OSzone.net 2001-2012