Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   вытянуть информацию из html полученного через curl (http://forum.oszone.net/showthread.php?t=344862)

Griboed0ff 16-04-2020 08:26 2917353

вытянуть информацию из html полученного через curl
 
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.

Griboed0ff 16-04-2020 08:27 2917354

@echo off
::chcp 866
cd /d "%~d0%~p0"
:: Удаляем файлы с прошлого запуска
ERASE 1.txt, 2.txt, 3.txt, 4.txt
:: узнаем ip пк
setlocal enabledelayedexpansion
(for /f "usebackq tokens=2 delims=:" %%a in (`ipconfig ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"`) do (
set _temp=%%a
set _ipaddress=!_temp:~1!
echo !_ipaddress! >1.txt
))
:: убираем последнюю цыфру ip
for /F %%i in (1.txt) do set result=%%i
set str=%result%
Echo %str:~0,7% >2.txt
:: берем предыдущее значение и пингуем 130-190.
for /F %%i in (2.txt) do set result2=%%i
for /l %%i in (130,1,190) do ping -n 1 -w 400 -l 1 %result2%.%%i >nul 2>&1 && arp -a %result2%.%%i|findstr "динам">>3.txt
:: выбираем из списка только ip
FOR /f "usebackq delims= " %%i IN ("3.txt") DO echo %%i>> 4.txt
::подставляем ip в команду скачивания странички.
FOR /f "usebackq delims=" %%i IN ("4.txt") DO (
set result3=%%i
D:\bat\phone\curl-7.69.1-win64-mingw\bin\curl -k -o %%i.txt https://%%i/CGI/Java/Serviceability?...tistics.device >nul 2>&1
)
::ищем и копируем нужно на страничке

pause

в общем батник для сбора информации о телефонах в подсети, в которой находится пк. У телефонов только есть веб морда, с которой есть нужная инфа.

DJ Mogarych 16-04-2020 08:57 2917356

Цитата:

Цитата Griboed0ff
именно через bat »

Powershell не используется из принципа?

Код:

$html = (gc "D:\temp\10.83.3.150.html.txt" -encoding utf8) -replace "<.*?>",";" -split ';+ ' -replace "^.*;"

$obj = [pscustomobject]@{'MAC-адрес'= $html[-18]
          'Номер телефона'= $html[-16]
          'Серийный номер'= $html[-11]
          'Номер модели'= $html[-10]
          }


Griboed0ff 16-04-2020 09:37 2917358

Цитата:

Цитата DJ Mogarych
Powershell не используется из принципа? »

Я ни разу не пользовался, если использовать Powershell, то надо переписывать и весь остальной батник, либо как-то запускать данный скрипт из батника.

DJ Mogarych 16-04-2020 10:17 2917363

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

На мой взгляд, это гораздо понятнее батников с их нагромождением костылей и спецсимволов. К тому же, в PS мы имеем дело с объектами, а не с текстом.

Iska 16-04-2020 10:17 2917365

Griboed0ff, переписывайте.

Griboed0ff 16-04-2020 10:17 2917366

Пробовал запустить отрабатывает без ошибок, но где результат посмотреть или записать его в файл?!

Цитата:

Цитата DJ Mogarych
Вряд ли переписать будет сложно. »

Я сегодня первый раз запустил ps1 скрипт, я вообще ничего не знаю про него и не могу даже вывод скрипта вашего увидеть. Что-то написать сейчас это за гранью фантастики.

DJ Mogarych 16-04-2020 10:22 2917369

Я поместил результат в переменную $obj.
Чтобы вывести её содержимое, нужно написать $obj после скрипта.

Самый наглядный метод - выполнять скрипт из Powershell ISE (см. в меню Пуск). Там есть кнопочка "плей", как на магнитофоне.

Вам файл в каком виде нужен?

Griboed0ff 16-04-2020 10:27 2917370

Цитата:

Цитата DJ Mogarych
Я поместил результат в переменную $obj.
Чтобы вывести её содержимое, нужно написать $obj после скрипта. »

спасибо получилось, это просто превосходно по сравнению с батником.
Тогда помогите пожалуйста с остальным: задача снять данные с веб морд айпишек в диапазоне *.*.*.130-*.*.*.190, в подсети где находится комп на котором запускается, сложить это все в .csv или txt

curl на компах не установлен, я просто ложил рядом с батником и указывал в батнике путь к нему. Можно ли в Powershell только встроенными средствами?

DJ Mogarych 16-04-2020 10:36 2917374

Если вы в Powershell выполните что-то типа
Код:

(curl "https://192.168.0.130/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent
(подставьте правильный ip), это будет тот самый html?

Griboed0ff 16-04-2020 10:50 2917379

Цитата:

Цитата DJ Mogarych
(подставьте правильный ip), это будет тот самый html? »

Да это он

DJ Mogarych 16-04-2020 11:05 2917385

Приведите кусок того, что будет в результате:
Код:

$report = @()
$ips = 130..190 |% {"192.168.0." + $_}

foreach ($ip in $ips) {
    if (Test-Connection $ip -Count 1 -Quiet) {
    $html = (curl "https://$ip/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent -replace "<.*?>",";" -split ';+ ' -replace "^.*;"
        $obj = [pscustomobject]@{'MAC-адрес'= $html[-18]
        'Номер телефона'= $html[-16]
        'Серийный номер'= $html[-11]
        'Номер модели'= $html[-10]
        }
    }
$report += $obj
}

$report


Griboed0ff 16-04-2020 11:28 2917391

выдает ошибку
Цитата:

Цитата DJ Mogarych
$ips = 130..190 |% {"192.168.0." + $_} »

Подсеть всегда разная, сейчас 10.83.3.0/24, к примеру на другом пк будет 10.80.50.0/24, одинаковость в подсетях только 10.*.*.*/24

DJ Mogarych 16-04-2020 11:37 2917393

Тогда замените строку
Код:

$ips = 130..190 |% {"192.168.0." + $_}
на
Код:

$ips = "10.83.3.1","10.83.3.2"
, где это будет два заведомо правильных IP.

Griboed0ff 16-04-2020 12:11 2917409

вписал два реальных ip на которых точно есть нужная html страничка.

DJ Mogarych 16-04-2020 12:54 2917428

Вставьте в начало скрипта вот этот код:
Код:

add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy


Griboed0ff 16-04-2020 13:03 2917432

Цитата:

Цитата DJ Mogarych
Вставьте в начало скрипта вот этот код: »

Отлично, скрипт отработал. Осталось только как-то заставить его собирать инфу с 130 по 190 ip в подсети где запускается скрипт. Так как у нас организация и подсетей под каждый офис много (тысячи).

DJ Mogarych 16-04-2020 13:38 2917443

Где можно получить IP компов? Есть DNS? Домен? DHCP?

Надо разобраться и найти закономерности строения тех или иных сетей.
Либо, придётся рисовать скрипт для каждой подсети отдельно.

Griboed0ff 16-04-2020 13:45 2917445

можно просто взять ip пк, с которого запускается скрипт, отбросить последнюю цифру и записать в переменную для дальнейшей обработки.
$ips = 130..190 |% {"192.168.0." + $_}, 192.168.0. заменить на переменную с прошлого шага

Griboed0ff 16-04-2020 14:06 2917449

в батнике так и было сделано, но проблема, что в ps я не знаю как это сделать.

DJ Mogarych 16-04-2020 14:10 2917450

Код:

$ips = 130..190 |% {"$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")" + $_}
Экспорт в csv:
Код:

$report |export-csv -Path c:\temp\123.csv -Delimiter ';' -Encoding utf8 -NoTypeInformation

Griboed0ff 16-04-2020 14:30 2917455

почему то повторяются значения.

DJ Mogarych 16-04-2020 14:39 2917458

Вставьте после $report += $obj
Код:

Clear-Variable html,obj
Также, для наглядности добавьте в $obj IP-адрес:
Код:

        $obj = [pscustomobject]@{'IP' = $ip
        'MAC-адрес'= $html[-18]
        'Номер телефона'= $html[-16]
        'Серийный номер'= $html[-11]
        'Номер модели'= $html[-10]
        }


Griboed0ff 16-04-2020 15:06 2917466

еще заметил что разные модели имеют разный адрес странички, http://10.83.3.156/ и если изменить адрес на $html = (curl "http://$ip").rawcontent -replace "<.*?>",";" -split ';+ ' -replace "^.*;", то ничего не находит
MAC-адрес Номер телефона Серийный номер Номер модели
--------- -------------- -------------- ------------
HTTP/1.1 200 OK...

Griboed0ff 16-04-2020 15:26 2917470

другие модели имеют другую структуру страничек.

Griboed0ff 16-04-2020 15:38 2917471

Цитата:

Цитата DJ Mogarych
Вставьте после $report += $obj »

спасибо работает и вид лучше с ip более понятно.

Griboed0ff 16-04-2020 15:50 2917473

изменил адрес странички, айпишки, которые до этого нормально отдавали данные, даже просто по адресу (http://10.83.3.156/) нормально работает и дальше. Но другие модели не получается снять данные, похоже поиск неправильно работает.

DJ Mogarych 16-04-2020 18:22 2917499

Цитата:

Цитата Griboed0ff
другие модели »

Сколько у вас этих моделей? Я что-то утомился уже, не ожидал, что придётся тут целый проект мутить на коленке.

А как это батником вы собирались реализовывать, вообще уму непостижимо.

Griboed0ff 16-04-2020 18:45 2917501

две модели у нас, у второй просто другой адрес, структура поменялась и получается парсер не срабатывает. Я так понимаю дело в
Цитата:

Цитата DJ Mogarych
$obj = [pscustomobject]@{'IP' = $ip
'MAC-адрес'= $html[-18]
'Номер телефона'= $html[-16]
'Серийный номер'= $html[-11]
'Номер модели'= $html[-10]
} »

в цифрах в конце строк -18 -16 -11 -10, но не могу понять как это работает, чтобы подогнать под другую страничку, слова поиска совпадают так же адрес номер серийник модель.

DJ Mogarych 16-04-2020 18:49 2917502

Ладно, две попробуем.

Надо эти HTML-файлы парсить по-разному, там даже в одной и той же таблицы тэги отсортированы по-разному, вот, например, в нужной таблице:
Первая модель - <table cellspacing="10" cellpadding="0" border="0">
Вторая модель - <TABLE BORDER="0" CELLSPACING="10" CELLPADDING="0">

Griboed0ff 16-04-2020 18:50 2917503

Цитата:

Цитата DJ Mogarych
А как это батником вы собирались реализовывать, вообще уму непостижимо. »

скорее всего костылями, оставил бы для начала только строку с нужными данными, потом начал бы удалять данные от html типа тегов, потом бы пробовал бы посимвольно копировать нужное. Так сложно получилось, потому что пришлось получается весь батник переписать для ps. осталось немного, понять как настроить парсер.

Цитата:

Цитата DJ Mogarych
Надо эти HTML-файлы парсить по-разному, там даже в одной и той же таблицы тэги отсортированы по-разному »

то есть получается парсер настраивается даже не в цифрах на конце строк?

YuS_2 16-04-2020 19:00 2917506

Цитата:

Цитата DJ Mogarych
Я что-то утомился уже, не ожидал, что придётся тут целый проект мутить на коленке. »

Кстати, тут может пригодиться тот парсер таблиц
Чуток изменить его под задачу и вполне сгодится:
Script.ps1
Код:

param (
        #[parameter(Mandatory=$true)]
        [string]$infile= 'test1.html',
        [string]$outfile = 'table',
        [int]$number = 1 #номер таблицы
)
[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
$uri = "http://10.83.3.156/"
$html = iwr $uri
$tables = $html.parsedhtml.getelementsbytagname("table")

# Исключение таблиц, имеющих вложенные элементы TABLE:
$tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{$n=0}{
# Обработка всех элементов TABLE, включая со вложенными (вероятна ошибка структуры таблицы).
# Необходимо закомментировать строку кода выше и раскомментировать эту:
#$tables|%{$n=0}{

        $headers = @();$n++
        $tr = $_|%{$_.getelementsbytagname("tr")}
        if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
        %{$_.getelementsbytagname("th")}|select -exp innertext){
                $headers = $headers.trim()
        } else {
                $headers = 1..([linq.parallelenumerable]::max(
                        [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                )+1)|%{"H$_"}
        }
        $rowind = ,1 * $headers.count
        $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                $row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan
                try {
                        $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
                } catch {
                        write-host Разметка заголовков не соответствует размерам строк -for red
                        write-host $_ -for cyan
                }
        }
}

[pscustomobject]@{
        'MAC-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
        'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                        $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                  } else {
                                                          $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                  }
        'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
        'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
}


только цикл перебора адресов прикрутить и будет работать...
Сегодня уже лень думать... если что, завтра прикручу.

DJ Mogarych 16-04-2020 19:36 2917511

Цитата:

Цитата Griboed0ff
оставил бы для начала только строку с нужными данными »

Отличный совет, только строки в этом последнем html у названия и его значения разные. Перед одними стоят пробелы, перед другими - нет, и т. д.

Вот всё вместе, пробуйте:
Код:

add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$report = @()
$ips = 130..190 |% {"$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")" + $_}

foreach ($ip in $ips) {
    if (Test-Connection $ip -Count 1 -Quiet) {
    $html = (curl "https://$ip/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent

        if ($html -match "CP-7821") {
        $html = $html -replace "<.*?>",";" -split ';+ ' -replace "^.*;"
        $obj = [pscustomobject]@{'IP' = $ip
          'MAC-адрес'= $html[-18]
          'Номер телефона'= $html[-16]
          'Серийный номер'= $html[-11]
          'Номер модели'= $html[-10]
            }
        }

        elseif ($html -match "CP-6921") {
        $html = $html -split '<tr>' -replace "<.*?>" -replace '&nbsp;'
        $obj = [pscustomobject]@{'IP' = $ip
          'MAC-адрес'= ($html[-18]).trim() -replace "mac-.*`n\s+"
          'Номер телефона'= ($html[-16]).trim() -replace ".*1.*`n.*`n\s+"
          'Серийный номер'= ($html[-12]).trim() -replace ".*`n\s+"
          'Номер модели'= ($html[-11]).trim() -replace ".*`n\s+"
            }
        }
    }
$report += $obj
Clear-Variable html,obj
}

$report |export-csv -Path c:\temp\123.csv -Delimiter ';' -Encoding utf8 -NoTypeInformation


Griboed0ff 16-04-2020 21:22 2917537

CP-7821 работает нормально, CP-6921 нет

DJ Mogarych 16-04-2020 22:10 2917555

исправил выше

Griboed0ff 17-04-2020 08:18 2917599

Цитата:

Цитата DJ Mogarych
исправил выше »

ура работает, спасибо большое.

Griboed0ff 17-04-2020 08:33 2917601

Цитата:

Цитата YuS_2
только цикл перебора адресов прикрутить и будет работать...
Сегодня уже лень думать... если что, завтра прикручу. »

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

DJ Mogarych 17-04-2020 08:45 2917603

Цитата:

Цитата Griboed0ff
собирать данные с веб морд принтеров »

Для этого есть специализированное ПО. Полагаю, что и с телефонами оно тоже есть, наверняка с них можно получить информацию не только через HTML, а, например, с сервера, куда эти телефоны подключаются.
В принципе, можно заниматься тем, чем мы тут занимались в этой теме, но это только ради спортивного интереса, в целом это, конечно, костыли.

Griboed0ff 17-04-2020 08:55 2917605

Цитата:

Цитата DJ Mogarych
Для этого есть специализированное ПО. »

да я знаю что оно есть, но задача одним файлом запущенным с пк получить инвентаризационные данные. Модель и серийник мониторов(сделано через бат), мак адрес сетевушки(сделано через бат), данные айпишки (их уже сняли через ps), потом попробую это все слепить во что-то одно.

YuS_2 17-04-2020 09:44 2917617

Цитата:

Цитата Griboed0ff
смогу ли я, например, пропарсить странички с другой структурой? насколько с понял парсер извлекает данные со странички, а потом уже можно из них дергать, то что нужно.»

В исходном скрипте парсятся таблицы и конвертируются в csv. Таблиц на страницах может быть несколько, а также они могут иметь вложенную структуру. Со вложенными таблицами - не всё просто, их парсер разобрать вряд ли сумеет, только можно исключить из разбора и парсить только конечные, которые не имеют вложенных элементов TABLE.
Если структура требуемых страниц отличается, то естественно, придется скрипт корректировать... т.е. так, чтобы была полная универсальность, в костылях сделать не получится...

Цитата:

Цитата Griboed0ff
Парсер мне еще много раз пригодится, например собирать данные с веб морд принтеров, поэтому хочу научиться настраивать его под нужную страничку. »

Ну, собственно, здесь, я попытался сделать то, что можно корректировать под конкретную структуру, это та часть, которая начинается с
Код:

[pscustomobject]@{
- это формирование хэш-таблицы, в которой дергаются данные из того, что было выбрано парсером.
Т.к. исходный парсер использует все таблицы, то в конечном пришлось добавить параметр номера таблицы (нумерация начинается с 0), в которой находятся необходимые данные. Этот номер сильно зависит от структуры страницы и автоматом его определять сложно, необходима привязка к конечным данным.

Цитата:

Цитата Griboed0ff
Например сейчас есть потребность снимать данные со странички, у которой есть авторизация. »

Любой парсер будет зависеть от структуры страницы, универсальность в наших костылях - предел мечтаний, так что...

Griboed0ff 17-04-2020 10:32 2917626

Цитата:

Цитата YuS_2
[pscustomobject]@{ »

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

Griboed0ff 17-04-2020 10:37 2917627

добавил сверху то, что рекомендовал DJ Mogarych. Теперь ошибка другая.

YuS_2 17-04-2020 16:30 2917708

Цитата:

Цитата Griboed0ff
попробовал ваш код, имеется ошибка. »

Да, там была ошибка в наименовании переменной...
Цитата:

Цитата Griboed0ff
добавил сверху то, что рекомендовал DJ Mogarych. Теперь ошибка другая. »

Добавлю, чуть позже... там ещё, видимо, код придется переделать, чтобы не из файла получать данные, а скачивать его... в invoke-webrequest от рождения присутствует баг с кодировками, а т.к. тут присутствует кириллица, то код тот будет неправильно работать.

YuS_2 17-04-2020 17:01 2917713

Цитата:

Цитата YuS_2
чуть позже... »

вот, прикрутил перебор адресов, стыренный у DJ Mogarych :)
ну и подкорректировал немного скрипт, плюс вывод в CSV
Код:

param (
        #[parameter(Mandatory=$true)]
        $encode = 65001,
        [string]$outfile = 'out.csv',
        [int]$number = 1 # номер таблицы
)

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'
$ips = 130..190 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}

$ips|%{
        $html = new-object -com "HTMLFile"
        $html.ihtmldocument2_write($(irm $_|convert $encode 28591))
        $tables = $html.getelementsbytagname("table")
        $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{
                $headers = @();
                $tr = $_|%{$_.getelementsbytagname("tr")}
                if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
                %{$_.getelementsbytagname("th")}|select -exp innertext){
                        $headers = $headers.trim()
                } else {
                        $headers = 1..([linq.parallelenumerable]::max(
                                [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                        )+1)|%{"H$_"}
                }
                $rowind = ,1 * $headers.count
                $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                        $row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan
                        try {
                                $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
                        } catch {
                                write-host Разметка заголовков не соответствует размерам строк -for red
                                write-host $_ -for cyan
                        }
                }
        }
        [pscustomobject]@{
                'IP'                                = $_
                'MAC-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
        }
} |export-csv $outfile -notype -enc utf8 -d ';'

- здесь подразумевается номер таблицы 1 и таблица с данными должна быть из двух колонок (если будет больше, то скрипт придется корректировать)

Griboed0ff 18-04-2020 08:42 2917792

Цитата:

Цитата YuS_2
вот, прикрутил перебор адресов, стыренный у DJ Mogarych
ну и подкорректировал немного скрипт, плюс вывод в CSV »

Вот это монстрище получилось!
Только дублирует информацию и почему только один вид айпишек.

YuS_2 18-04-2020 09:58 2917799

Цитата:

Цитата Griboed0ff
Только дублирует информацию»

судя по характеру ошибок, там есть отсутствующие в сети хосты... надо их сначала пропинговать, перед разбором массива, тогда не будет ошибок и дубликатов...
В общем, заменить эту строку:
Код:

$ips = 130..190 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}
этой:
Код:

$ips = 130..190 |% {[string]$((Get-Netipaddress |
? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|
?{test-connection $_ -count 1 -q}

Время обработки, естественно увеличится...

Цитата:

Цитата Griboed0ff
и почему только один вид айпишек. »

Один - потому, что Get-Netipaddress... тут будут только IP из интерфейсов текущего компьютера.
Чтобы получить все сети, придется писать сканер сети (что нежелательно), либо составить заранее список сетей...
Примерно так:
Код:

$net = '10.83.3.', '10.80.5.', '10.82.0.'
- в общем, перечислить все необходимые, а потом:
переделать строку в такую:
Код:

$ips = $net|%{$ip = $_;130..190|%{$ip + $_}}|?{test-connection $_ -count 1 -q}

Griboed0ff 18-04-2020 10:49 2917802

результат
IP MAC-адрес Номер телефона Серийный номер Номер модели
10.83.3.130 ??? ??? ??? ???
10.83.3.131 ??? ??? ??? ???
10.83.3.132 ??? ??? ??? ???
10.83.3.133 ??? ??? ??? ???
10.83.3.134 ??? ??? ??? ???
10.83.3.135 ??? ??? ??? ???
10.83.3.136 442B031A8F7F 60314 PXN16090HOX CP-6921
10.83.3.137 442B031A8F7F 60314 PXN16090HOX CP-6921
10.83.3.138 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.139 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.140 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.141 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.142 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.143 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.144 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.145 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.146 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.147 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.148 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.149 442B031A7868 60319 PXN16090A7Q CP-6921
10.83.3.150 ??? ??? ??? ???
10.83.3.151 ??? ??? ??? ???
10.83.3.152 442B031A8F85 60136 PXN16090HP3 CP-6921
10.83.3.153 442B031A947B 60565 PXN16090FUP CP-6921
10.83.3.154 442B031A947B 60565 PXN16090FUP CP-6921
10.83.3.155 ??? ??? ??? ???
10.83.3.156 A44C1147B379 60397 PXN161704LE CP-6921
10.83.3.157 A44C1147B379 60397 PXN161704LE CP-6921
10.83.3.158 A44C1147B379 60397 PXN161704LE CP-6921
10.83.3.159 A44C1147B379 60397 PXN161704LE CP-6921
10.83.3.160 A44C1147B379 60397 PXN161704LE CP-6921
10.83.3.161 442B031A9AF3 60504 PXN16090F3D CP-6921
10.83.3.162 442B031A9AF3 60504 PXN16090F3D CP-6921

нет тут другое он записал на каждую найденную айпишку одни и те же данные. Так было уже
Цитата:

Цитата DJ Mogarych
Аватара для DJ Mogarych
fascinating rhythm
Moderator
Сообщения: 5044
Благодарности: 900
Конфигурация
Профиль | Сайт | Отправить PM | Цитировать | Сообщить модератору
Вставьте после $report += $obj
Код: Выделить весь код
C »

Цитата:

Цитата DJ Mogarych
Вставьте после $report += $obj
Код: Выделить весь код
Clear-Variable html,obj »

Айпишки разных видов есть в этой подсети точно и в другую подсеть не надо лазить.

По идее решение устроило и работает как надо. Как я понял в вашем парсере проще настроить по таблицам и колонкам. Если доделаем то в теории я смогу потом его переделать под другую ситуацию или это решение поможет кому-то в похожей ситуации.

YuS_2 18-04-2020 11:50 2917809

Цитата:

Цитата Griboed0ff
нет тут другое он записал на каждую найденную айпишку одни и те же данные. Так было уже»

Что значит другое?
Вы проверили наличие хостов в сети?
В моем коде, реализация иная, т.е. это не то же самое... заполняется теми же данными только из-за отсутствия реальных IP в сети, т.е. цикл заполнения происходит, но IP отсутствует, данные не считываются и строка заполняется предыдущими...

Цитата:

Цитата Griboed0ff
на каждую найденную айпишку одни и те же данные.»

Здесь, IP не найдены, а сформированы в массив из другого массива 130..190
Сделайте так, как я выше написал... т.е., как минимум, строка должна быть такой:
Код:

$ips = 130..190 |% {[string]$((Get-Netipaddress|? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|?{test-connection $_ -count 1 -q}
Цитата:

Цитата Griboed0ff
Айпишки разных видов есть в этой подсети точно и в другую подсеть не надо лазить. »

Посмотрите, что есть у Вас здесь:
Код:

(Get-Netipaddress |? ipaddress -match "^10\.").ipaddress
- покажите результат.

Цитата:

Цитата Griboed0ff
Как я понял в вашем парсере проще настроить по таблицам и колонкам. »

Немного проще, но прямая зависимость от dom-структуры, в частности элементов TABLE, всё же, есть...

Добавлено:
Цитата:

Цитата YuS_2
Сделайте так, как я выше написал... т.е., как минимум, строка должна быть такой: »

А вообще, по логике, если эта строка:
Код:

(Get-Netipaddress |? ipaddress -match "^10\.").ipaddress
- выдает не единственный адрес, то правильнее было бы так записать:
Код:

[array]$arr = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}


Griboed0ff 19-04-2020 09:15 2917925

выполнил ваши рекомендации, похоже, что проблема в том, что парсер настроен на один тип страничек, а у двух разных моделей данные находятся в разных таблицах. Результат выполнения вашего скрипта и DJ Mogarych.

YuS_2 19-04-2020 11:10 2917942

Цитата:

Цитата Griboed0ff
похоже, что проблема в том, что парсер настроен на один тип страничек, а у двух разных моделей данные находятся в разных таблицах. »

Нет, таблицы он определяет правильно... по крайней мере в тех двух файлах, что Вы приводили выше...
Здесь, проблема с кодировкой у командлета invoke-restmethod, т.е. это по алгоритму, то же самое, что и invoke-webrequest, и в том, и в другом используется движок IE... что там у него внутри происходит и как именно выбирается кодировка - известно только разрабам.
Попробуйте исключить перекодировку в этой строке:
Цитата:

$html.ihtmldocument2_write($(irm $_|convert $encode 28591))
или использовать другие типы в параметре $encode
Доступные кодировки:
Код:

[text.encoding]::getencodings()
использовать можно, как и CodePage, так и Name
В крайнем случае, можно с помощью invoke-webrequest скачивать файл, создавать его в виде промежуточного и потом использовать в разборе... так кодировка ломаться не должна.

Griboed0ff 19-04-2020 11:26 2917945

ага вот она где ошибка:
Скрытый текст
IP MAC-адрес Номер телефона Серийный номер Номер модели
10.83.3.136 Нет Нет Нет Нет
10.83.3.138 Нет Нет Нет Нет
10.83.3.150 00778DF9AE1C 60013 WZP230900DN CP-7821
10.83.3.152 Нет Нет Нет Нет
10.83.3.153 Нет Нет Нет Нет
10.83.3.155 6CFA8903D741 60103 WZP18210A38 CP-7821
10.83.3.156 Нет Нет Нет Нет
10.83.3.161 Нет Нет Нет Нет
10.83.3.163 00778DF9B414 60135 WZP230901QL CP-7821
10.83.3.165 00778DF9B416 60394 WZP230901QN CP-7821
10.83.3.166 6CFA8903E9B2 60506 WZP18210DT9 CP-7821
10.83.3.167 00778DF8C919 60146 WZP23070DGM CP-7821
10.83.3.168 00778DF8C936 60355 WZP23070DHG CP-7821
10.83.3.171 00778DF9B413 60163 WZP230901QK CP-7821
10.83.3.172 00778DF8C948 60116 WZP23070DJ0 CP-7821
10.83.3.174 00778DF8C95A 60390 WZP23070DJJ CP-7821
10.83.3.175 00778DF9B400 60158 WZP230901Q0 CP-7821
теперь он понимает другие айпшки, но перестает первые понимать

мб запускать парсер с кодировкой записывать удачное, а вторым циклом без кодировки, так же записывать только удачные?

YuS_2 19-04-2020 12:41 2917961

Цитата:

Цитата Griboed0ff
мб запускать парсер с кодировкой записывать удачное, а вторым циклом без кодировки, так же записывать только удачные? »

Можно и так, конечно, но с точки зрения программирования, это уже не автоматизация :)

Выполните:
Код:

iwr '10.83.3.136' -out '10.83.3.136.html'
iwr '10.83.3.150' -out '10.83.3.150.html'

Заверните в архив оба файла и приложите сюда, либо в личку... попробуем что-нибудь придумать...

Griboed0ff 19-04-2020 12:51 2917962

вот странички.

YuS_2 19-04-2020 13:38 2917968

Цитата:

Цитата Griboed0ff
вот странички. »

Хмм, страницы в одинаковой кодировке... выложил на сайт и обе страницы считываются одинаково. Видимо, есть зависимость в общении командлета и конкретного хоста...
Ну, да ладно. Должно помочь вот это:
script.ps1
Код:

param (
        #[parameter(Mandatory=$true)]
        $encode = 65001,
        [string]$outfile = 'table.csv',
        [int]$number = 1
)

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 = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
        $html = new-object -com "HTMLFile"
        $html.ihtmldocument2_write(($h = irm $_))
        if ($h -match [char]208){
                $html = new-object -com "HTMLFile"
                $html.ihtmldocument2_write($(irm $_|convert $encode 28591))
        }
        $tables = $html.getelementsbytagname("table")
        $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{
                $headers = @();
                $tr = $_|%{$_.getelementsbytagname("tr")}
                if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
                %{$_.getelementsbytagname("th")}|select -exp innertext){
                        $headers = $headers.trim()
                } else {
                        $headers = 1..([linq.parallelenumerable]::max(
                                [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                        )+1)|%{"H$_"}
                }
                $rowind = ,1 * $headers.count
                $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                        $row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan
                        try {
                                $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
                        } catch {
                                write-host Разметка заголовков не соответствует размерам строк -for red
                                write-host $_ -for cyan
                        }
                }
        }
        [pscustomobject]@{
                'IP'                                = $_
                'MAC-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
        }
} |export-csv $outfile -notype -enc utf8 -d ';'


Griboed0ff 19-04-2020 14:08 2917971

Цитата:

Цитата YuS_2
Ну, да ладно. Должно помочь вот это: »

это помогло. Работает ответы со скриптом DJ Mogarych совпадают, проверил оба скрипта соответствуют действительности.

теперь в этой теме два решения. Осталось понять в чем различия, плюсы минусы.

YuS_2 19-04-2020 14:57 2917986

Цитата:

Цитата Griboed0ff
Осталось понять в чем различия, плюсы минусы. »

Больше интересен вопрос, почему нет проблемы с кодировкой в этом решении, а в моем присутствует... по сути, получение данных однотипное...
Надо бы проверить варианты:
Код:

$html1 = (curl "https://10.83.3.136/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent
$html2 = irm "https://10.83.3.136/CGI/Java/Serviceability?adapter=device.statistics.device"
$html1
$html2

- и сравнить кодировку...

А плюсы и минусы:
1. DJ Mogarych
2. YuS_2,
1.
Плюсы:
Работает быстрее.
Минусы:
Привязка к номеру модели.
Привязан к внутренней структуре таблицы (если, например, добавится столбец с пустыми значениями, то код придется корректировать)
При наличии атрибутов rowspan или colspan, значения таблицы могут "поплыть", т.е. выходной файл не будет соответствовать исходной таблице.
2.
Плюсы:
Разбирает таблицу даже при наличии colspan и rowspan
Нет зависимости от пустых столбцов.
Минусы:
Работает медленнее
Есть привязка к структуре таблицы (две колонки с данными), если количество колонок с данными изменяется, потребуется корректировка.

Griboed0ff 19-04-2020 15:13 2917989

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

Цитата:

Цитата YuS_2
Надо бы проверить варианты: »

результат

PS C:\WINDOWS\system32> $html1 = (curl "http://10.83.3.136").rawcontent
$html2 = irm "http://10.83.3.136"
$html1
$html2
HTTP/1.1 200 OK
Connection: close
Content-Type: text/html
Server: WindRiver-WebServer/4.4
WWW-Authenticate: Basic realm="SEP442B031A8F7F"

<HTML>
<HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-8"/><TITLE>Cisco Systems, Inc.</TITLE>
</HEAD>
<BODY bgcolor="#FFFFFF" link="#FFFFFF" vlink="#FFFFFF" alink="#FFFFFF" text="#003031"><TABLE BORDER="1" WIDTH="100%" HEIGHT="100%" CELLSPACING="0" CELLPADDING="0" bordercolor="#003031"><TR>
<td WIDTH="200" HEIGHT="100" ALIGN=center><A HREF="http://www.cisco.com"><IMG SRC="cisco_Logo.gif" width="130" height="95"></A></TD><td HEIGHT="50" bgcolor="#003031"><p ALIGN=center><B><font color="#FFFFFF" size="6
">Информация об устройстве</FONT></B>
<p ALIGN=center><B><font color="#FFFFFF" size="4">IP-телефон Cisco CP-6921 (</FONT></B> <font color="#FFFFFF"><strong>SEP442b031a8f7f</strong> </font><B><font color="#FFFFFF" size="4">)</FONT></FONT></B></TD
>
</TR>
<TR><td WIDTH="200" ALIGN=center VALIGN=top bgcolor="#003031"><TABLE BORDER="0" CELLSPACING="10" CELLPADDING="0">
<TR>
<TD><a href="/">Информация об устройстве</a></TD>
</TR>
<TR>
<TD><a href="NetworkConfiguration">Настройка сети</a></TD>
</TR>
<!--<TR>
<TD><a href="device.html">Параметры устройства</a></TD>
</TR>
<TR>
<TD><a href="security.html">Настройкa безопасности</a></TD>
</TR>
<TR>
<TD><a href="status.html">Состояние</a></TD>
</TR>-->

<TR>
<TD><B><font color='#FFFFFF'>Статистика сети</FONT></B></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="EthernetInformation">Информация о Ethernet</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="PortInformation?1">Сеть</A></TD>
</TR>
<TR>
<TD><B><font color='#FFFFFF'>Журналы устр-ва</FONT></B></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="console.html">Протоколы</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="coredump.html">Дампы ядра</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="status.html">Сообщения о состоянии</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<a href="debug.html"> Показать отладку</A></TD>
</TR>
<TR>
<TD><B><font color='#FFFFFF'>Потоковая статистика</FONT></B></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="StreamingStatistics?1">Поток 1</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="StreamingStatistics?2">Поток 2</A></TD>
</TR>
</TABLE>
</TD>
<td VALIGN=top><DIV ALIGN=center>
<TABLE BORDER="0" CELLSPACING="10" CELLPADDING="0"><TR>
<TD><B>MAC-адрес</B></TD>
<td width=20></TD><TD><B>442B031A8F7F</B></TD>
</TR>
<TR>
<TD><B>Имя хоста</B></TD>
<td width=20></TD><TD><B>SEP442b031a8f7f</B></TD>
</TR>




<TR>
<TD><B>Номер телефона 1</B></TD>
<TD width=20></TD>
<TD><B>60314</B></TD>
</TR>




<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<TR>
<TD><B> Код загруженного приложения</B></TD>
<td width=20></TD><TD><B>SCCP 9.4.1.3.SR3</B></TD>
</TR><TR>
<TD><B> Код загрузки системы</B></TD>
<td width=20></TD><TD><strong>0.0.0.14</strong></TD>
</TR><TR>
<TD><B> Ð*евизия аппар. oбесп.</B></TD>
<td width=20></TD><TD><strong>5</strong></TD>
</TR>
<TR>
<TD><B> Серийный номер</B></TD>
<td width=20></TD><TD><strong>PXN16090HOX</strong></TD>
</TR>
<TR>
<TD><B> Номер модели</B></TD>
<td width=20></TD><TD><strong>CP-6921</strong></TD>
</TR>
<TR>
<TD><B> Сообщение в сост. ожидания</B></TD>
<td width=20></TD><TD><strong>Нет</strong></TD>
</TR>
<TR>
<TD><B>UDI</B></TD>
<td width=20></TD>
<TD><B>Телефон</B></TD>
</TR>
<TR><TD>&nbsp;</TD>
<td width=20></TD>
<TD><strong>IP-телефон Cisco CP-6921</strong></TD>
</TR>
<TR><TD>&nbsp;</TD>
<td width=20></TD>
<TD><strong>CP-6921</strong></TD>
</TR>
<TR>
<TD>&nbsp;</TD>
<TD width=20></TD>
<TD><strong>PXN16090HOX</strong></TD>
</TR>
<TR>
<TD>&nbsp;</TD>
<TD width=20></TD>
<TD><strong>74-6516-02 H0Rev= V02</strong></TD>
</TR>
<TR>
<TD><B>Время</B></TD>
<td width=20></TD>
<TD><strong>17:14</strong></TD>
</TR>
<TR>
<TD><B>Часовой пояс</B></TD>
<td width=20></TD>
<TD><strong>Etc/GMT-5</strong></TD>
</TR>
<TR>
<TD><B>Дата</B></TD>
<td width=20></TD>
<TD><strong>19.04.20</strong></TD>
</TR>
<TR>
<TD><B>Включен режим FIPS</B></TD>
<td width=20></TD>
<TD><strong>

Нет

</strong></TD>
</TR>
</TABLE>
</DIV></TD></TR></TABLE></BODY></HTML>
<HTML>
<HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-8"/><TITLE>Cisco Systems, Inc.</TITLE>
</HEAD>
<BODY bgcolor="#FFFFFF" link="#FFFFFF" vlink="#FFFFFF" alink="#FFFFFF" text="#003031"><TABLE BORDER="1" WIDTH="100%" HEIGHT="100%" CELLSPACING="0" CELLPADDING="0" bordercolor="#003031"><TR>
<td WIDTH="200" HEIGHT="100" ALIGN=center><A HREF="http://www.cisco.com"><IMG SRC="cisco_Logo.gif" width="130" height="95"></A></TD><td HEIGHT="50" bgcolor="#003031"><p ALIGN=center><B><font color="#FFFFFF" size="6
">Информация об устройстве</FONT></B>
<p ALIGN=center><B><font color="#FFFFFF" size="4">IP-телефон Cisco CP-6921 (</FONT></B> <font color="#FFFFFF"><strong>SEP442b031a8f7f</strong> </font><B><font color="#FFFFFF" size="4">)</FONT></FONT></B></TD
>
</TR>
<TR><td WIDTH="200" ALIGN=center VALIGN=top bgcolor="#003031"><TABLE BORDER="0" CELLSPACING="10" CELLPADDING="0">
<TR>
<TD><a href="/">Информация об устройстве</a></TD>
</TR>
<TR>
<TD><a href="NetworkConfiguration">Настройка сети</a></TD>
</TR>
<!--<TR>
<TD><a href="device.html">Параметры устройства</a></TD>
</TR>
<TR>
<TD><a href="security.html">Настройкa безопасности</a></TD>
</TR>
<TR>
<TD><a href="status.html">Состояние</a></TD>
</TR>-->

<TR>
<TD><B><font color='#FFFFFF'>Статистика сети</FONT></B></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="EthernetInformation">Информация о Ethernet</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="PortInformation?1">Сеть</A></TD>
</TR>
<TR>
<TD><B><font color='#FFFFFF'>Журналы устр-ва</FONT></B></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="console.html">Протоколы</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="coredump.html">Дампы ядра</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="status.html">Сообщения о состоянии</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<a href="debug.html"> Показать отладку</A></TD>
</TR>
<TR>
<TD><B><font color='#FFFFFF'>Потоковая статистика</FONT></B></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="StreamingStatistics?1">Поток 1</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;&nbsp;<a href="StreamingStatistics?2">Поток 2</A></TD>
</TR>
</TABLE>
</TD>
<td VALIGN=top><DIV ALIGN=center>
<TABLE BORDER="0" CELLSPACING="10" CELLPADDING="0"><TR>
<TD><B>MAC-адрес</B></TD>
<td width=20></TD><TD><B>442B031A8F7F</B></TD>
</TR>
<TR>
<TD><B>Имя хоста</B></TD>
<td width=20></TD><TD><B>SEP442b031a8f7f</B></TD>
</TR>




<TR>
<TD><B>Номер телефона 1</B></TD>
<TD width=20></TD>
<TD><B>60314</B></TD>
</TR>




<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<!-- -->



<TR>
<TD><B> Код загруженного приложения</B></TD>
<td width=20></TD><TD><B>SCCP 9.4.1.3.SR3</B></TD>
</TR><TR>
<TD><B> Код загрузки системы</B></TD>
<td width=20></TD><TD><strong>0.0.0.14</strong></TD>
</TR><TR>
<TD><B> Ð*евизия аппар. oбесп.</B></TD>
<td width=20></TD><TD><strong>5</strong></TD>
</TR>
<TR>
<TD><B> Серийный номер</B></TD>
<td width=20></TD><TD><strong>PXN16090HOX</strong></TD>
</TR>
<TR>
<TD><B> Номер модели</B></TD>
<td width=20></TD><TD><strong>CP-6921</strong></TD>
</TR>
<TR>
<TD><B> Сообщение в сост. ожидания</B></TD>
<td width=20></TD><TD><strong>Нет</strong></TD>
</TR>
<TR>
<TD><B>UDI</B></TD>
<td width=20></TD>
<TD><B>Телефон</B></TD>
</TR>
<TR><TD>&nbsp;</TD>
<td width=20></TD>
<TD><strong>IP-телефон Cisco CP-6921</strong></TD>
</TR>
<TR><TD>&nbsp;</TD>
<td width=20></TD>
<TD><strong>CP-6921</strong></TD>
</TR>
<TR>
<TD>&nbsp;</TD>
<TD width=20></TD>
<TD><strong>PXN16090HOX</strong></TD>
</TR>
<TR>
<TD>&nbsp;</TD>
<TD width=20></TD>
<TD><strong>74-6516-02 H0Rev= V02</strong></TD>
</TR>
<TR>
<TD><B>Время</B></TD>
<td width=20></TD>
<TD><strong>17:14</strong></TD>
</TR>
<TR>
<TD><B>Часовой пояс</B></TD>
<td width=20></TD>
<TD><strong>Etc/GMT-5</strong></TD>
</TR>
<TR>
<TD><B>Дата</B></TD>
<td width=20></TD>
<TD><strong>19.04.20</strong></TD>
</TR>
<TR>
<TD><B>Включен режим FIPS</B></TD>
<td width=20></TD>
<TD><strong>

Нет

</strong></TD>
</TR>
</TABLE>
</DIV></TD></TR></TABLE></BODY></HTML>

PS C:\WINDOWS\system32>

YuS_2 19-04-2020 16:54 2918002

Цитата:

Цитата Griboed0ff
результат »

Понятно. Получается так:
В том скрипте не учитывается кодировка, там просто данные разрезаются и по индексу массива выдергиваются... а сами данные - не кириллица, поэтому кодировка неважна.
В моем скрипте формируется массив кастомных объектов при разборе таблицы, а потом по содержимому элементов массива получаем индекс нужных данных и формируем новый массив. Поэтому кодировка важна.

Griboed0ff 19-04-2020 18:48 2918018

Я думаю вернусь когда буду читать морды мфу

Griboed0ff 20-04-2020 11:00 2918104

Цитата:

Цитата YuS_2
Ну, да ладно. Должно помочь вот это: »

ошибки
PS C:\Windows\system32> D:\1.ps1
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "ihtmldocument2_write".
D:\1.ps1:24 знак:30
+ $html.ihtmldocument2_write(($h = irm $_))
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (ihtmldocument2_write:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "ihtmldocument2_write".
D:\1.ps1:27 знак:32
+ $html.ihtmldocument2_write($(irm $_|convert $encode 28591))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (ihtmldocument2_write:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Не удается индексировать в массив NULL.
D:\1.ps1:30 знак:2
+ $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\1.ps1:82 знак:2
+ [pscustomobject]@{
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException

Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "ihtmldocument2_write".
D:\1.ps1:24 знак:30
+ $html.ihtmldocument2_write(($h = irm $_))
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (ihtmldocument2_write:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "ihtmldocument2_write".
D:\1.ps1:27 знак:32
+ $html.ihtmldocument2_write($(irm $_|convert $encode 28591))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (ihtmldocument2_write:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Не удается индексировать в массив NULL.
D:\1.ps1:30 знак:2
+ $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\1.ps1:82 знак:2
+ [pscustomobject]@{
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException
опробовал на вроде таких же страничках и посыпались ошибки. Странички приложил.

Griboed0ff 20-04-2020 12:34 2918114

В данный момент ip адрес запроса это результат
Код:

[array]$arr = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

Можно ли сделать чтобы подсети брались из файла?
Например в файле
Код:

10.80.1.
10.80.26.
10.83.3.

брать первую часто запроса из файла, а вторую как и раньше с 130 по 190 айпишник.

YuS_2 20-04-2020 12:48 2918115

Цитата:

Цитата Griboed0ff
опробовал на вроде таких же страничках и посыпались ошибки. Странички приложил. »

Странички не при чем. Дело в версии powershell.
Командлет Invoke-WebRequest и Invoke-RestMethod добавлены в powershell v 3.0, а методы парсеров html, возможно и в более поздние версии...
В общем, имеет смысл обновить powershell до актуальной версии...
Да, есть нюанс: если на машине нет Internet Explorer-а, то командлеты эти использовать не получится... они тесно связаны с ним.
Ещё один нюанс: если используется powershell core, т.е. версия новее 5.1, то методы парсинга html через IE, в них уже вырезаны, там придется использовать внешние парсеры типа PowerHTML, в которых уже используется парсинг по типу XML (XPATH и т.п.)... но это уже будет совсем другой скрипт.

Griboed0ff 20-04-2020 12:53 2918116

Цитата:

Цитата YuS_2
В общем, имеет смысл обновить powershell до актуальной версии... »

такой стоит
Код:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      15063  786


YuS_2 20-04-2020 12:53 2918117

Цитата:

Цитата Griboed0ff
Можно ли сделать чтобы подсети брались из файла? »

Конечно. Именно так, будет лучше... кстати, это предлагал DJ Mogarych...
Код:

[array]$arr = gc 'list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

Цитата:

Цитата Griboed0ff
такой стоит »

Значит отсутствует IE... в ошибках указывается на отсутствие методов...

Griboed0ff 20-04-2020 12:59 2918120

Цитата:

Цитата YuS_2
Значит отсутствует IE... в ошибках указывается на отсутствие методов... »

IE тоже есть, может запускать не от админа.

YuS_2 20-04-2020 13:11 2918125

Цитата:

Цитата Griboed0ff
IE тоже есть, может запускать не от админа. »

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

Griboed0ff 20-04-2020 13:24 2918129

Кстати на моем пк, на других моделях айпишек скрипт отработал корректно! :up
Тогда непонятно почему на других пк не работает. Пошик не не старый, ie есть. :dont-know

YuS_2 20-04-2020 17:28 2918201

Цитата:

Цитата Griboed0ff
Тогда непонятно почему на других пк не работает. »

может net framework не обновлен? без физического доступа, трудно что-либо предполагать...
Вот переделанный скрипт:
script.ps1
Код:

param (
        #[parameter(Mandatory=$true)]
        $encode = 65001,
        [string]$outfile = 'table.csv',
        [int]$number = 1
)

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 'list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
        $html = iwr $_
        $tables = $html.parsedhtml.getelementsbytagname("table")
        $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{
                $headers = @();
                $tr = $_|%{$_.getelementsbytagname("tr")}
                if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
                %{$_.getelementsbytagname("th")}|select -exp innertext){
                        if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
                        $headers = $headers.trim()
                } else {
                        $headers = 1..([linq.parallelenumerable]::max(
                                [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                        )+1)|%{"H$_"}
                }
                $rowind = ,1 * $headers.count
                $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                        $row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan
                        if($row.innertext -match [char]208){
                                for($i=0;$i -lt $row.count;$i++){
                                        $row[$i].innertext = $row[$i].innertext|convert $encode 28591
                                }
                        }
                        try {
                                $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
                        } catch {
                                write-host Разметка заголовков не соответствует размерам строк -for red
                                write-host $_ -for cyan
                        }
                }
        }
        [pscustomobject]@{
                'IP'                                = $_
                'MAC-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
        }
} |export-csv $outfile -notype -enc utf8 -d ';'



- но тормоз получился изрядный...

Griboed0ff 20-04-2020 18:02 2918211

Цитата:

Цитата YuS_2
- но тормоз получился изрядный... »

это вообще не проблема.
Это полное решение. Работает на 4 видах айпишек.

придется из батника запускать так как на компах не включено исполнение ps скриптов. типа команда Set-ExecutionPolicy RemoteSigned и потом запуск скрипта. Есть ли варианты включить эту команду в сам скрипт, чтобы не городить батников?

YuS_2 20-04-2020 18:26 2918220

Цитата:

Цитата Griboed0ff
Есть ли варианты включить эту команду в сам скрипт, чтобы не городить батников? »

Батником проще, ибо изменение политики запуска скриптов потребует ручного вмешательства.
Батник:
Код:

powershell -ex bypass .\script.ps1

Griboed0ff 20-04-2020 18:31 2918222

Цитата:

Цитата YuS_2
Батник: »

я использовал такое решение, нагуглил
Код:

@echo off
SetLocal EnableExtensions

set "ps=" & for %%X in (powerShell.exe) do set "ps=%%~$PATH:X"
if not defined ps set "ps=%systemRoot%\syswow64\windowsPowerShell\v1.0\powerShell.exe"

For /F "UseBackQ delims=" %%a in (`"cmd /c "
  "%ps%" -ExecutionPolicy ByPass -NoProfile -command "D:\1.ps1"
""`) do (
  echo %%a
)
pause

объяснение было такое что по умолчанию винда может и не знать через что запускать скрипт

YuS_2 20-04-2020 21:42 2918255

Цитата:

Цитата Griboed0ff
я использовал такое решение »

это почти то же самое, только с дополнительной проверкой переменной среды окружения PATH, на наличие пути к исполняемому файлу powershell.exe
Но, имхо, это излишне, если, конечно, эта переменная не подвергалась ручным изменениям...

Griboed0ff 21-04-2020 09:30 2918316

Интересно есть ли ограничение по объему входных данных. Я скормил ему файлик с 700 подсетями, уже скоро как сутки чем то занят, не прерываю вдруг закончит все же.

YuS_2 21-04-2020 10:09 2918323

Цитата:

Цитата Griboed0ff
Интересно есть ли ограничение по объему входных данных. »

Не должно быть, но можно последить за потреблением памяти...
Цитата:

Цитата Griboed0ff
уже скоро как сутки чем то занят »

а я предупреждал, что получился великий тормоз :)
Можно, конечно, было бы и прогрессбар прикрутить, но это только добавит "тормозов"
Чтобы проще было наблюдать, можно организовать вывод каждого IP в отдельный файл...

Griboed0ff 21-04-2020 11:24 2918339

Цитата:

Цитата YuS_2
а я предупреждал, что получился великий тормоз »

Это не страшно, просто первый раз запустил скрипт с большим объемом обрабатываемой информации и не понимал работает или нет. Реально только потребление памяти немного меняется. Так массово запускать буду редко, в основном сбор инфы только с одной подсетью.
Цитата:

Цитата YuS_2
Можно, конечно, было бы и прогрессбар прикрутить, но это только добавит "тормозов" »

это да лишнее, работает не трогай :)

YuS_2, помогите пожалуйста собрать теперь этого Франкенштейна

DJ Mogarych 21-04-2020 12:47 2918358

Цитата:

Цитата Griboed0ff
скормил ему файлик с 700 подсетями, уже скоро как сутки чем то занят »

Когда возникают такие ситуации, это значит, что задача решается не теми методами.

Griboed0ff 21-04-2020 13:23 2918374

Цитата:

Цитата DJ Mogarych
Когда возникают такие ситуации, это значит, что задача решается не теми методами. »

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

DJ Mogarych 21-04-2020 22:10 2918441

Про GLPI слышали или вообще про инвентаризационный софт?

YuS_2 21-04-2020 23:18 2918451

Цитата:

Цитата Griboed0ff
согласен, но других инструментов нет и не предвидится »

Ну почему нет... я вот упоминал про PowerHTML
Вот, скрипт на его основе:
script.ps1
Код:

param (
        #[parameter(Mandatory=$true)]
        [string]$outfile = 'table_phtml.csv',
        $encode = 65001,
        [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 'list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

$ips|%{
        $a = (iwr $_).content
        $content = if ($a -match [char]208){
                $a|convert $encode 28591
        } 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 $null}|%{
                        $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-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
        }
} |export-csv $outfile -notype -enc utf8 -d ';'



Плюсы:
Работает гораздо быстрее предыдущих вариантов парсинга через IE
Парсер не зависит от наличия IE в системе. Может работать на версиях Powershell Core, где встроенный парсер HTML, связанный с IE, был вырезан, т.е. работает на самых свежих версиях powershell Core...
Таблицу разбирает, также с учетом rowspan и colspan
Минусы:
Зависимость от dom-структуры, всё также, присутствует...

Возможно, что-то не учтено (собирал по-быстрому), но проверен на тех страницах, которые здесь были показаны...

Griboed0ff 22-04-2020 07:23 2918470

Цитата:

Цитата DJ Mogarych
Про GLPI слышали или вообще про инвентаризационный софт? »

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

Griboed0ff 22-04-2020 09:04 2918477

Цитата:

Цитата YuS_2
Вот, скрипт на его основе: »

Скрытый текст
Код:

PS D:\Users\S> param (
        #[parameter(Mandatory=$true)]
        [string]$outfile = 'table_phtml.csv',
        $encode = 65001,
        [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 = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

$ips%{
        $a = (iwr $_).content
        $content = if ($a -match [char]208){
                $aconvert $encode 28591
        } 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 $null}%{
                        $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-адрес'                = $tbl[([array]indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]indexof($tbl.h1,'Номер модели'))].h2
        }
} export-csv D:\Users\S\Downloads\1\1.csv -notype -enc utf8 -d ';'
строка:19 знак:26
+        $fenc = [text.encoding]getencoding($from)
+                                ~~~~~~~~~~~
Непредвиденная лексема "getencoding" в выражении или операторе.
строка:20 знак:26
+        $tenc = [text.encoding]getencoding($to)
+                                ~~~~~~~~~~~
Непредвиденная лексема "getencoding" в выражении или операторе.
строка:27 знак:26
+ [net.servicepointmanager]securityprotocol = 'ssl3,tls,tls11,tls12'
+                          ~~~~~~~~~~~~~~~~
Непредвиденная лексема "securityprotocol" в выражении или операторе.
строка:34 знак:13
+        $aconvert $encode 28591
+                  ~~~~~~~
Непредвиденная лексема "$encode" в выражении или операторе.
строка:34 знак:21
+        $aconvert $encode 28591
+                          ~~~~~
Непредвиденная лексема "28591" в выражении или операторе.
строка:37 знак:26
+    $html = [net.webutility]htmldecode($content)convertfrom-html
+                            ~~~~~~~~~~
Непредвиденная лексема "htmldecode" в выражении или операторе.
строка:40 знак:19
+    $tables = $tables{$_.innerhtml -notmatch 'table'}
+                      ~
Непредвиденная лексема "{" в выражении или операторе.
строка:42 знак:14
+    if ([string]isnullorempty($selecttable)){
+                ~~~~~~~~~~~~~
Непредвиденная лексема "isnullorempty" в выражении или операторе.
строка:42 знак:14
+    if ([string]isnullorempty($selecttable)){
+                ~~~~~~~~~~~~~
Отсутствует закрывающий знак ")" после выражения в операторе "if".
строка:31 знак:6
+ $ips%{
+      ~
Отсутствует закрывающий знак "}" в блоке операторов или определении типа.
Выданы сообщения не обо всех ошибках синтаксического анализа.  Исправьте перечисленные в сообщениях ошибки и повторите попытку.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

где-то скобки потерялись.

На рабочем пк другой результат выполнения скрипта, на рабочем пк нет внешнего интернета и powerhtml пришлось сложить в папку с модулями руками, перед выполнением скрипта выполняю импорт powerhtml, но я так понимаю не помогает.
Скрытый текст
Код:

PS C:\WINDOWS\system32> Import-Module PowerHTML
PS C:\WINDOWS\system32> D:\PowerShell\phone_powerhtml.ps1
new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загру
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+    $tbl = $tables[$number]|%{$n=0}{
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\PowerShell\phone_powerhtml.ps1:109 знак:2
+    [pscustomobject]@{
+    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загру
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+    $tbl = $tables[$number]|%{$n=0}{
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\PowerShell\phone_powerhtml.ps1:109 знак:2
+    [pscustomobject]@{
+    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загру
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+    $tbl = $tables[$number]|%{$n=0}{
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\PowerShell\phone_powerhtml.ps1:109 знак:2
+    [pscustomobject]@{
+    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загру
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+    $tbl = $tables[$number]|%{$n=0}{
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\PowerShell\phone_powerhtml.ps1:109 знак:2
+    [pscustomobject]@{
+    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загру
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+    $tbl = $tables[$number]|%{$n=0}{
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray


YuS_2 22-04-2020 09:18 2918480

Цитата:

Цитата Griboed0ff
где-то скобки потерялись. »

Наверное, здесь:
Цитата:

Цитата Griboed0ff
function convert ($from, $to){
begin{
$fenc = [text.encoding]getencoding($from)
$tenc = [text.encoding]getencoding($to)
} »

- двоеточия потерялись...
и здесь:
Цитата:

Цитата Griboed0ff
$ips%{ »

- не всё в порядке...
там куча таких огрехов...
Используйте исходный скрипт, или проверяйте после копирования/редактирования...

Griboed0ff 22-04-2020 09:34 2918484

Цитата:

Цитата YuS_2
- но тормоз получился изрядный... »

если в подсети нет айпишек, то начинает записывать данные с прошлой подсети на все что пингуется.
Скрытый текст
IP MAC-адрес Номер телефона Серийный номер Номер модели
10.81.1.134 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.137 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.139 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.140 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.141 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.143 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.144 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.145 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.146 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.147 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.148 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.149 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.150 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.151 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.152 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.155 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.157 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.160 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.163 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.165 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.166 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.167 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.169 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.170 00778DF9B400 60158 WZP230901Q0 CP-7821
10.81.1.172 00778DF9B400 60158 WZP230901Q0 CP-7821
это все компьютеры, которые просто живут там же 130-190

Скрытый текст
PS C:\WINDOWS\system32> D:\PowerShell\phone4.ps1
iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

iwr : Невозможно соединиться с удаленным сервером
D:\PowerShell\phone4.ps1:23 знак:10
+ $html = iwr $_
+ ~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

YuS_2 22-04-2020 09:42 2918487

Приведите в порядок код и всё заработает... :)

Griboed0ff 22-04-2020 10:46 2918502

Цитата:

Цитата YuS_2
Приведите в порядок код и всё заработает... »

этот
код
Код:

param (
        #[parameter(Mandatory=$true)]
        $encode = 65001,
        [string]$outfile = 'table.csv',
        [int]$number = 1
)

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\list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
        $html = iwr $_
        $tables = $html.parsedhtml.getelementsbytagname("table")
        $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{
                $headers = @();
                $tr = $_|%{$_.getelementsbytagname("tr")}
                if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
                %{$_.getelementsbytagname("th")}|select -exp innertext){
                        if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
                        $headers = $headers.trim()
                } else {
                        $headers = 1..([linq.parallelenumerable]::max(
                                [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                        )+1)|%{"H$_"}
                }
                $rowind = ,1 * $headers.count
                $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                        $row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan
                        if($row.innertext -match [char]208){
                                for($i=0;$i -lt $row.count;$i++){
                                        $row[$i].innertext = $row[$i].innertext|convert $encode 28591
                                }
                        }
                        try {
                                $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
                        } catch {
                                write-host Разметка заголовков не соответствует размерам строк -for red
                                write-host $_ -for cyan
                        }
                }
        }
        [pscustomobject]@{
                'IP'                                = $_
                'MAC-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
        }
} |export-csv D:\PowerShell\all_phone.csv -notype -enc utf8 -d ';'

я скопировал у вас, менял только путь к файлу подсетей и путь вывода. Отрабатывает нормально, но если нет в сети айпишек то берет какой-то результат и приписывает его ко всему, что пингуется.
Результат выполнения кода
Код:

10.81.1.134        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.137        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.139        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.140        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.141        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.143        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.144        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.145        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.146        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.147        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.148        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.149        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.150        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.151        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.152        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.155        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.157        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.160        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.163        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.165        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.166        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.167        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.169        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.170        00778DF88C94        60025        WZP23060APA        CP-7821
10.81.1.172        00778DF88C94        60025        WZP23060APA        CP-7821

ошибки, которые выдал, когда нет айпишек.
Код:

iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 
iwr : Невозможно соединиться с удаленным сервером
строка:23 знак:10
+    $html = iwr $_
+            ~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

В подсетях где есть айпишки этот же скрипт корректно выдает информацию.

YuS_2 22-04-2020 11:30 2918512

Цитата:

Цитата Griboed0ff
Отрабатывает нормально, но если нет в сети айпишек то берет какой-то результат и приписывает его ко всему, что пингуется. »

По идее, вот здесь:
Цитата:

Цитата Griboed0ff
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q} »

-есть проверка существования хостов и если они не отвечают, то в массив не должны попадать...
Хотя, конечно, есть вероятность того, что пока пингуется весь список по порядку, какой-либо хост отключается и соответственно, происходит именно то, что Вы описываете.
Бороться с этим можно так:
script.ps1
Код:

param (
        #[parameter(Mandatory=$true)]
        $encode = 65001,
        [string]$outfile = 'table.csv',
        [int]$number = 1
)

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\list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
        if (test-connection $_ -count 1 -q){
                try{
                        $html = iwr $_
                        $tables = $html.parsedhtml.getelementsbytagname("table")
                        $tbl = ($tables|?{($_.getelementsbytagname('table')|
                        %{$_}).count -eq 0})[$number]|%{
                                $headers = @();
                                $tr = $_|%{$_.getelementsbytagname("tr")}
                                if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
                                %{$_.getelementsbytagname("th")}|select -exp innertext){
                                        if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
                                        $headers = $headers.trim()
                                } else {
                                        $headers = 1..([linq.parallelenumerable]::max(
                                                [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                                        )+1)|%{"H$_"}
                                }
                                $rowind = ,1 * $headers.count
                                $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                                        $row = $_.getelementsbytagname("td") |? innertext -ne $null|
                                        select innertext,rowspan,colspan
                                        if($row.innertext -match [char]208){
                                                for($i=0;$i -lt $row.count;$i++){
                                                        $row[$i].innertext = $row[$i].innertext|convert $encode 28591
                                                }
                                        }
                                        $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-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                                          } else {
                                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                                          }
                                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
                        }
                } catch {
                        write-host Ошибка: $_ -for red
                }
        }
} |export-csv D:\PowerShell\all_phone.csv -notype -enc utf8 -d ';'



Но рекомендую довести до ума парсер с PowerHTML, это будет лучший вариант...

DJ Mogarych 22-04-2020 11:41 2918514

Цитата:

Цитата Griboed0ff
иб никогда не пропустит »

Да, вменяемые люди в ИБ - это большая редкость.
Windows они пропустили, циско и т. п., а GLPI - это нельзя. Смешно.

Griboed0ff 22-04-2020 12:09 2918519

Цитата:

Цитата YuS_2
PowerHTML Вот, скрипт на его основе: »

смог запустить powerhtml, но вывод оказался пустой.
Скрипт
Код:

param (
        #[parameter(Mandatory=$true)]
        [string]$outfile = 'table_phtml.csv',
        $encode = 65001,
        [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\list_Net.txt'
$ips = 2..254 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

$ips|%{
        $a = (iwr $_).content
        $content = if ($a -match [char]208){
                $a|convert $encode 28591
        } 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 $null}|%{
                        $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-адрес'                = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
                'Номер телефона'        = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
                                                                $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
                                                          } else {
                                                                  $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
                                                          }
                'Серийный номер'        = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
                'Номер модели'                = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
        }
} |export-csv D:\PowerShell\all_phone_html.csv -notype -enc utf8 -d ';'

ошибки
Код:

new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загружена.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\PowerHTML\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:47 знак:12
+        $tr = if($_.element('tbody')){
+                  ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "element".
D:\PowerShell\phone_powerhtml.ps1:51 знак:23
+        if($headers = $tr|?{$_.element('th') -ne $null}|
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (element:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "elements".
D:\PowerShell\phone_powerhtml.ps1:58 знак:8
+ ...              %{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (elements:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "elements".
D:\PowerShell\phone_powerhtml.ps1:58 знак:8
+ ...              %{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (elements:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "elements".
D:\PowerShell\phone_powerhtml.ps1:58 знак:8
+ ...              %{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (elements:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "elements".
D:\PowerShell\phone_powerhtml.ps1:58 знак:8
+ ...              %{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (elements:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Сбой вызова метода из-за отсутствия в [System.__ComObject] метода с именем "elements".


Цитата:

Цитата YuS_2:
Но рекомендую довести до ума парсер с PowerHTML, это будет лучший вариант... »

похоже мои ошибки вызваны неработающим powerhtml?
Цитата:

Цитата YuS_2
Бороться с этим можно так: »

помогло.

YuS_2 22-04-2020 12:46 2918525

Цитата:

Цитата Griboed0ff
похоже мои ошибки вызваны неработающим powerhtml? »

Да. Без этого:

работать не будет...
Необходимо модуль установить...

Griboed0ff 22-04-2020 12:59 2918529

Цитата:

Цитата YuS_2
Необходимо модуль установить... »

Установил на пк где есть инет, скопировал папку с модулем и положил по тому же пути на пк где инет ограничен. В списке модулей числится, перед запуском скрипта выполняю импорт модуля, без ошибок. Видимо каких-то связей не хватает.

Griboed0ff 22-04-2020 13:25 2918534

Скрытый текст
Код:

PS C:\WINDOWS\system32> get-module powerhtml

ModuleType Version    Name                                ExportedCommands                                                                                                                                         
---------- -------    ----                                ----------------                                                                                                                                         
Script    0.1.7      powerhtml                          ConvertFrom-Html                                                                                                                                         
Script    0.1.7      PowerHTML                          ConvertFrom-Html                                                                                                                                         



PS C:\WINDOWS\system32> get-instaledmodule powerhtml
get-instaledmodule : Имя "get-instaledmodule" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после
 чего повторите попытку.
строка:1 знак:1
+ get-instaledmodule powerhtml
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (get-instaledmodule:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

PS C:\WINDOWS\system32> get-installedmodule powerhtml
ПРЕДУПРЕЖДЕНИЕ: Не удалось скачать список доступных поставщиков. Проверьте подключение к Интернету.

Version    Name                                Type      Repository          Description                                                                                                                         
-------    ----                                ----      ----------          -----------                                                                                                                         
0.1.7      PowerHTML                          Module    https://www.power... Provides a wrapper for HTML Agility Pack for use where the IE HTML DOM from Invoke-WebRequest is not available such as Powershell Core



Скрытый текст
Код:

new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загружена.
C:\Program Files\WindowsPowerShell\Modules\powerhtml\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+            $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\powerhtml\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                    $htmlDoc.LoadHtml($inputItem)
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+    [array]$tables = $html.selectnodes('//table')
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+    $tbl = $tables[$number]|%{$n=0}{
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\PowerShell\phone_powerhtml.ps1:109 знак:2
+    [pscustomobject]@{
+    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

еще ise всегда спрашивает разрешения на запуск скриптов, я так понимаю это политикой домена или у винды по умолчанию так. Щас попробую на другой доменной тачке.

YuS_2 22-04-2020 14:32 2918542

Цитата:

Цитата Griboed0ff
Установил на пк где есть инет »

Там работает скрипт?

Цитата:

Цитата Griboed0ff
скопировал папку с модулем и положил по тому же пути на пк где инет ограничен. »

Странно, должен работать. Попробуйте в консоли выполнить:
Код:

find-module powerhtml -rep "PSGallery"|save-module -path 'D:\localMODULE'
и из этого каталога взять модуль и скопировать на другой компьютер...
Ну, можно ещё попробовать в скрипт добавить строку:
Код:

import-module powerhtml
Цитата:

Цитата Griboed0ff
еще ise всегда спрашивает разрешения на запуск скриптов, я так понимаю это политикой домена или у винды по умолчанию так. »

а в консоли выполняются?
По умолчанию, политика запуска скриптов запрещает не подписанные.
Цитата:

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

Код:

set-executionpolicy remotesigned
Дополнительные сведения см. в описании командлета Set-ExecutionPolicy.

Griboed0ff 22-04-2020 14:58 2918546

Цитата:

Цитата YuS_2
По умолчанию, политика запуска скриптов запрещает не подписанные. »

Это политика доменная оказалась, попробовал на другом пк powerhtml. Работает, задал ему сеть где один айпишки 2-254, нашел все, правда парочку не смог считать, но одна страничка оказалась на английском поэтому и не считалась, а вторая видимо имеет другую структуру. Так же заметил в мониторинге сети, что скрипт ничего не вроде как никуда первые минут 5-7 не посылает, а потом за пару минут скачивают всю инфу.
Цитата:

Цитата YuS_2
Бороться с этим можно так: »

это постигло и скрипт poewrhtml, если нет айпишек в сети то пишет ерунду с прошлого запуска.

Griboed0ff 22-04-2020 15:19 2918548

Получился довольно универсальный в теме айпишек скрипт, не скрипт, а проект уже целый. Я благодарен участникам данного форума, что помогли решить задачу именно строенными средствами винды. :clapping: :up

YuS_2 22-04-2020 18:05 2918570

Цитата:

Цитата Griboed0ff
скрипт ничего не вроде как никуда первые минут 5-7 не посылает, а потом за пару минут скачивают всю инфу. »

там он сначала пингует хосты, с одновременным формированием доступных IP

Цитата:

Цитата Griboed0ff
это постигло и скрипт poewrhtml, если нет айпишек в сети то пишет ерунду с прошлого запуска. »

Да, там то же самое надо сделать, сейчас добавлю...

Griboed0ff 22-04-2020 18:08 2918571

Цитата:

Цитата YuS_2
сейчас добавлю »

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

YuS_2 22-04-2020 19:38 2918581

Цитата:

Цитата Griboed0ff
правда парочку не смог считать, но одна страничка оказалась на английском поэтому и не считалась »

Руки бы поотшибать этим "сиськопрограммерам" html... :)
Мало того, что впихнули внутрь ячеек тег <b>...</b>, так ещё и кодировку умудрились использовать windows-1251...
В общем, так как-то:
script_phtml.ps1
Код:

param (
        #[parameter(Mandatory=$true)]
        [string]$outfile = 'table_phtml.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\list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

$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 D:\PowerShell\all_phone.csv -notype -enc utf8 -d ';' -append


Griboed0ff 23-04-2020 08:02 2918623

Цитата:

Цитата YuS_2
В общем, так как-то: »

Идеально!!! Сейчас кажется даже если и появится какая-нибудь модель айпишки, то мне кажется в скрипте уже все варианты перечислены. Спасибо огромное!

DJ Mogarych 23-04-2020 08:57 2918629

Цитата:

Цитата YuS_2
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
if (test-connection $_ -count 1 -q){ »

проверка соединения 2 раза

YuS_2 23-04-2020 12:09 2918668

Цитата:

Цитата DJ Mogarych
проверка соединения 2 раза »

Цитата:

Цитата YuS_2
-есть проверка существования хостов и если они не отвечают, то в массив не должны попадать...
Хотя, конечно, есть вероятность того, что пока пингуется весь список по порядку, какой-либо хост отключается и соответственно, происходит именно то, что Вы описываете. »


Griboed0ff 08-05-2020 12:09 2920315

Цитата:

Цитата YuS_2
-есть проверка существования хостов и если они не отвечают, то в массив не должны попадать... »

Убрал первую проверку пингом и дело пошло быстрее намного.
Скрытый текст
Код:

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 2920334

Цитата:

Цитата Griboed0ff
Интересно если вообще пинг убрать, то еще быстрее будет? »

если его убрать, то будут ошибки... выше Вы сами о них сообщали.

Кстати, код я немного изменил, в этой части:
Скрытый текст
Код:

$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


- возможно, скорости не прибавит, но так будет правильнее...

Цитата:

Цитата Griboed0ff
Может пошик умеет пинговать многопоточно? »

можно ранспейсы задействовать, но это целиком скрипт придется запускать в фоне, т.е. выходные файлы будут разными...
можно попробовать использовать workflow с конструкцией foreach -parallel (...){...}, примерно так:
Код:

ForEach -Parallel ($<item> in $<collection>)
{
    [<Activity1>]
    [<Activity2>]
    ...
}

где, команды будут выполняться параллельно, но коллекция перебирается последовательно...
В общем, простор для творчества есть...

Foreigner 08-05-2020 17:31 2920340

Цитата:

Цитата YuS_2
попробовать использовать workflow »

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

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


YuS_2 08-05-2020 18:03 2920343

Цитата:

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

Да, это кстати, как раз, упрощенное использование runspace...

Iska 08-05-2020 23:43 2920389

Foreigner, а реально там как — хост пользует несколько ядер единовременно?

Foreigner 09-05-2020 01:06 2920395


Цитата:

Цитата Iska
а реально там как — хост пользует несколько ядер единовременно? »

Если честно, не знаю. Но прирост производительности наглядный, например пинг ускоряется в три раза. Но в справке написано, что -parallel не для всего подходит. Нужно выяснять путем тестирования.

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

YuS_2 09-05-2020 08:12 2920410

Foreigner, Iska,
Цитата:

Цитата Iska
хост пользует несколько ядер единовременно? »

https://devblogs.microsoft.com/power...allel-feature/

Iska 09-05-2020 08:27 2920411

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 2920413

Цитата:

Цитата YuS_2
Кстати, код я немного изменил, в этой части: »

не смогу проверить пока срипт не переберет 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 2920434

Цитата:

Цитата Griboed0ff
готов к тестам. »

попробуйте так проверить:
Скрытый текст
Код:

...
$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 2920437

Цитата:

Цитата Griboed0ff
поставил, готов к тестам. »

Только учтите, что по умолчанию 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

На эту тему, можно почитать тут

YuS_2 09-05-2020 13:48 2920457

Цитата:

Цитата Foreigner
Только учтите, что по умолчанию PowerShell 7 работает с UTF8 »

Да, к тому же, utf8, в powershell core необходимо именовать utf-8...
По рукам бы надавать за такую вот "совместимость", этим индусам... :)

Griboed0ff 09-05-2020 14:00 2920458

Цитата:

Цитата YuS_2
попробуйте так проверить: »

Скрытый текст
Код:

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 ';' -append

Скрытый текст
Код:

PS 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 2920466

Ни на одном компе не работает.

Foreigner 09-05-2020 16:04 2920473

Цитата:

Цитата Griboed0ff
не работает »

По поводу строки 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 2920490

Цитата:

Цитата Griboed0ff
похоже надо доустановить »

не надо...
Про строку 28 уже написали...
А по поводу $using:number - ранее, переменная определялась внутри цикла foreach-object (что неправильно), а теперь я вынес её за пределы цикла.
В общем, надо добавить перед циклом:
Код:

...
if ([string]::isnullorempty($selecttable)){
        $number = 0
} else {$number = $selecttable}
$ips|% -parallel {
...


Griboed0ff 09-05-2020 19:06 2920497

Цитата:

Цитата YuS_2
В общем, надо добавить перед циклом: »

Скрытый текст
Код:

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 ';' -append

Скрытый текст
Код:

PS 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 2920503

скормил файлик с подсетями побольше
Скрытый текст
Код:

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 2920506

Цитата:

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

это из блока try-catch, т.е. пинг проходит, а (iwr $_).content - с ошибкой... проверьте вручную.

Цитата:

Цитата Griboed0ff
Недопустимый параметр: 28591 »

Проверьте, есть ли такие цифры в перечне:
Код:

[text.encoding]::getencodings()
Цитата:

Цитата Griboed0ff
файл заполнился нормально, но »

Хмм...
Цитата:

Цитата Griboed0ff
utf8 »

А вот тут, читали:
Цитата:

Цитата YuS_2
Да, к тому же, utf8, в powershell core необходимо именовать utf-8... »

? Надо исправить... и сам скрипт сохраняйте в utf-8

Цитата:

Цитата Griboed0ff
жаль ограничено количеством ядер. »

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

Griboed0ff 09-05-2020 19:45 2920507

Цитата:

Цитата YuS_2
Да, к тому же, utf8, в powershell core необходимо именовать utf-8. »

сохранял в utf-8. Что имеете ввиду "именовать"?

Цитата:

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

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

Foreigner 09-05-2020 19:50 2920510

Цитата:

Цитата Griboed0ff
Видимо 7 пошик и ошибки пишет другие »

Попробуйте все-таки вернуть:
Код:

[net.servicepointmanager]::securityprotocol = 0
Значение 0 отрабатывает нормально, можете поэкспериментировать

YuS_2 09-05-2020 19:56 2920512

Цитата:

Цитата Griboed0ff
сохранял в utf-8. Что имеете ввиду "именовать"? »

Цитата:

Цитата Griboed0ff
} -throttlelimit 4 |export-csv $outfile -notype -enc utf8 -d ';' -append »

Цитата:

Цитата Griboed0ff
поставил 100, пошик занял всю память »

что естественно, ведь это ресурсоемкий вариант использования...

Griboed0ff 09-05-2020 20:04 2920513

Цитата:

Цитата Foreigner
Попробуйте все-таки вернуть: »

поставил, работает, немного пишет все таки, но я так понимаю это неизбежно.
Скрытый текст
Код:

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



Цитата:

Цитата YuS_2
} -throttlelimit 4 |export-csv $outfile -notype -enc utf8 -d ';' -append » »

значит все условия выполнены. Думаю не критично, пару столбиков напишу руками :)

YuS_2 09-05-2020 20:25 2920519

Цитата:

Цитата Griboed0ff
немного пишет все таки, но я так понимаю это неизбежно. »

Добавьте в начале цикла переменную $ip, здесь:
Код:

...
try {
                        $ip = $_
                        $a = (iwr $_).content
...

а потом в секции catch, строку поменяйте на такую:
Код:

...
                } catch {
                        write-host Ошибка: $ip - $_ -for red
                }
...

Цитата:

Цитата Griboed0ff
значит все условия выполнены »

какие условия? Там надо поменять utf8 на utf-8

Griboed0ff 09-05-2020 21:15 2920525

Цитата:

Цитата YuS_2
write-host Ошибка: $ip - $_ -for red »

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

YuS_2 09-05-2020 21:28 2920528

Цитата:

Цитата Griboed0ff
посмотрел на 159 нет в сети никаких устройств. »

а пинг вручную пробовали именно на такие IP?
Код:

test-connection XXX.XXX.XXX.159 -count 1 -q -timeout 1
что выдают?

Griboed0ff 09-05-2020 21:42 2920531

Цитата:

Цитата YuS_2
что выдают? »

true, но с другого компа та же команда выдала false

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

YuS_2 09-05-2020 22:32 2920541

Цитата:

Цитата Griboed0ff
true, но с другого компа та же команда выдала false »

странно... но это сетевые настройки уже надо копать. По идее, такого быть не должно...

Griboed0ff 10-05-2020 13:03 2920590

Цитата:

Цитата YuS_2
что естественно, ведь это ресурсоемкий вариант использования... »

все же core имеет проблемки, суть в том, что процесс пошика начинает копится в озу потом лезет в файл подкачки, когда заполняет все работа судя сетевой активности прекращается. Сначала подумал надо поставить не 100, а меньше намного, в общем в несколько тестов разобрался, что даже если потоков будет 2, то процесс пошика все равно забивает память, но медленно. То есть память процесса не очищается и ее заполнение неизбежно.

Griboed0ff 10-05-2020 13:41 2920595

250 подсетей скрипт отработал на 100 потоков, а вот 2500 уже не хватает памяти хоть на скольких потоков.

YuS_2 10-05-2020 15:48 2920623

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

Griboed0ff 10-05-2020 16:01 2920624

Цитата:

Цитата YuS_2
Ничего не поделаешь »

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

Griboed0ff 10-05-2020 19:05 2920650

нормально обрабатывает список по 50 строк, больше начинаются приколы.

Foreigner 10-05-2020 19:26 2920651

Цитата:

Цитата Griboed0ff
может как то выдавать скрипту части списка, например, по пять строк? »

А как хранится этот список?

Griboed0ff 10-05-2020 19:36 2920653

Цитата:

Цитата Foreigner
А как хранится этот список? »

файлик txt, внутри список столбиком
Код:

10.10.10.
10.10.20.
10.10.30.

у меня почти 3000 подсетей\строк в файлике, по 50 строк обрабатывает на ура.

Foreigner 10-05-2020 19:50 2920656

Цитата:

Цитата Griboed0ff
файлик txt, внутри список столбиком »

Если речь про pwsh, тогда попробуйте запускать так:
Код:

PS > get-content file.txt -readcount 50 | foreach -parallel { script.ps1 $_ } -throttlelimit $(сколько потоков)
Если powershell:
Код:

PS > get-content file.txt -readcount 50 | foreach { script.ps1 $_ }

Griboed0ff 10-05-2020 20:18 2920659

Цитата:

Цитата Foreigner
Если речь про pwsh, тогда попробуйте запускать так: »

я так понимаю надо тогда в самом скрипте убирать лишнее?
Скрытый текст
Код:

param (
        #[parameter(Mandatory=$true)]
        [string]$outfile = 'D:\PowerShell\готовые\общийпошик7.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 = 0
[array]$arr  = gc 'D:\PowerShell\готовые\ip1.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

if ([string]::isnullorempty($selecttable)){
        $number = 0
} else {$number = $selecttable}
$ips|% -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 1000 |export-csv $outfile -notype -enc utf-8 -d ';' -append

Скрытый текст
Код:

get-content D:\PowerShell\готовые\ip1.txt -readcount 50 | foreach -parallel { D:\PowerShell\готовые\phone_p7.ps1 $_ } -throttlelimit $(1000)
Скрытый текст
Код:

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
    |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.96.34.
    | 10.96.37. 10.96.39. 10.96.49. 10.96.50. 10.96.169. 10.96.155. 10.96.146. 10.96.195. 10.96.54.
    | 10.96.106. 10.96.184. 10.96.117. 10.96.162. 10.96.158. 10.96.124. 10.96.125. 10.96.55. 10.96.130.
    | 10.96.131. 10.96.137. 10.96.138. 10.96.140. 10.96.196. 10.96.193. 10.96.120. 10.96.126. 10.96.51.
    | 10.96.166. 10.96.30. 10.97.5. 10.96.70. 10.97.218. 10.97.60. 10.97.137. 10.97.16. 10.97.219.
    | 10.97.209. 10.96.48. 10.96.53. 10.96.148. 10.98.17. 10.96.80. 10.96.175. 10.96.173. 10.96.176.
    | 10.96.151. 10.96.44. 10.96.167. 10.96.160'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
    |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.96.165.
    | 10.96.197. 10.96.180. 10.96.199. 10.96.200. 10.96.179. 10.96.181. 10.96.31. 10.97.7. 10.96.121.
    | 10.96.202. 10.96.203. 10.96.161. 10.97.6. 10.97.10. 10.97.12. 10.96.189. 10.97.58. 10.97.14. 10.97.15.
    | 10.97.27. 10.97.34. 10.97.74. 10.97.35. 10.97.30. 10.97.26. 10.97.81. 10.97.24. 10.97.77. 10.96.60.
    | 10.97.83. 10.96.154. 10.96.72. 10.96.73. 10.96.65. 10.96.94. 10.97.23. 10.97.212. 10.97.211. 10.97.82.
    | 10.98.11. 10.97.47. 10.97.49. 10.96.89. 10.97.101. 10.97.71. 10.97.120. 10.97.55. 10.96.118. 10.97.57'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
    |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.97.18.
    | 10.97.67. 10.97.119. 10.97.22. 10.97.28. 10.97.68. 10.97.32. 10.97.33. 10.97.61. 10.97.43. 10.97.69.
    | 10.97.62. 10.97.72. 10.97.75. 10.97.79. 10.97.100. 10.97.109. 10.97.110. 10.96.111. 10.97.106.
    | 10.96.164. 10.97.111. 10.97.114. 10.96.32. 10.97.115. 10.97.118. 10.98.59. 10.97.54. 10.98.61.
    | 10.98.64. 10.98.70. 10.98.68. 10.98.69. 10.98.73. 10.98.67. 10.98.71. 10.98.77. 10.98.75. 10.98.106.
    | 10.98.78. 10.98.81. 10.98.79. 10.98.80. 10.98.85. 10.98.92. 10.98.90. 10.98.87. 10.98.86. 10.98.83.
    | 10.98.82'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
    |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.98.84.
    | 10.98.88. 10.98.89. 10.98.95. 10.98.97. 10.98.91. 10.98.93. 10.98.98. 10.98.94. 10.98.96. 10.98.102.
    | 10.98.104. 10.98.99. 10.98.101. 10.98.100. 10.98.103. 10.98.105. 10.98.111. 10.98.112. 10.98.108.
    | 10.98.107. 10.97.170. 10.98.74. 10.98.116. 10.98.115. 10.97.44. 10.98.114. 10.97.227. 10.96.22'

Export-Csv: D:\PowerShell\готовые\phone_p7.ps1:134
Line |
 134 |  … elimit 1000000 |export-csv $outfile -notype -enc utf-8 -d ';' -append
    |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Windows\System32\10.208.64.
    | 10.209.236. 10.208.67. 10.208.137. 10.208.134. 10.208.143. 10.208.146. 10.209.14. 10.209.13.
    | 10.209.16. 10.209.30. 10.209.234. 10.209.233. 10.209.209. 10.209.130. 10.209.211. 10.209.241.
    | 10.209.244. 10.209.235. 10.209.242. 10.209.239. 10.209.243. 10.208.36. 10.209.245. 10.209.251.
    | 10.209.246. 10.209.252. 10.208.19. 10.208.26. 10.208.32. 10.208.33. 10.208.46. 10.208.41. 10.97.164.
    | 10.97.201. 10.96.35. 10.96.27. 10.96.133. 10.96.69. 10.96.75. 10.98.29. 10.97.73. 10.98.32. 10.98.33.
    | 10.98.57. 10.97.196. 10.96.42. 10.96.108. 10.97.139. 10.96.183'


Foreigner 10-05-2020 21:15 2920665

Так, сразу и не разберешься. Применительно к скрипту, надо как-то менять саму конструкцию. Попробуйте заменить:

Код:

$ips|% -parallel {.....
на
Код:

$x = 0

for ($i =0; $i -le ($ips.count - 1); $i += 20)    # по 20 адресов
{
    $ips[$x..$i] | foreach -parallel { <здесь весь оставшийся код> } -throttlelimit 1000 | export-csv $outfile -notype -enc utf-8 -d ';' -append
    $x = $i + 1
}

Т.е. завернуть foreach ("%") в for
Проверить, понятное дело, не могу. И мне кажется, что лучше выбрать throttellimit другим, 1000, имхо, большой перебор. сколько ядер, умноженное на кол-во потоков одного ядра.

Ошибся:
Код:

for ($i =20;....

Griboed0ff 10-05-2020 21:32 2920668

Цитата:

Цитата Foreigner
Т.е. завернуть foreach ("%") в for »

запустил, работает, посмотрим, что насобирает. исправил обе 20 на 50, и throttellimit на 100.

YuS_2 10-05-2020 21:37 2920669

Цитата:

Цитата Foreigner
Если powershell: »

Если powrshell, то там это не нужно... runspace в нем задействовать придется по-другому.

Цитата:

Цитата Foreigner
Если речь про pwsh »

То именно запуск скрипта лучше не распараллеливать, распареллеливание реализовано уже внутри, тут как раз потребуется последовательное выполнение...

Griboed0ff,
В скрипте, который Вы показываете:
Цитата:

Цитата Griboed0ff
elimit 1000 »

А в логе ошибок:
Цитата:

Цитата Griboed0ff
elimit 1000000 »

:o
Так ресурсы, Вы не сэкономите... скушает скрипт их легко и быстро. :)

Griboed0ff 10-05-2020 21:49 2920672

Цитата:

Цитата YuS_2
А в логе ошибок: »

я просто экспериментировал, сейчас поставил снова 1000 и такой код:
Скрытый текст
Код:

param (
        #[parameter(Mandatory=$true)]
        [string]$outfile = 'D:\PowerShell\готовые\phone_50.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 = 0
[array]$arr  = gc 'D:\PowerShell\готовые\ip2.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort

if ([string]::isnullorempty($selecttable)){
        $number = 0
} else {$number = $selecttable}
$x = 0

for ($i =50; $i -le ($ips.count - 1); $i += 50)    # по 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 1000 | export-csv $outfile -notype -enc utf-8 -d ';' -append
    $x = $i + 1
        }

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

Griboed0ff 14-05-2020 15:55 2921118

Доброго всем времени суток. Прошлый скрипт работает отлично и уже собрал ~4000 аппаратов, его я запускаю со своего пк когда собираю инфу. Есть и другая версия скрипта, которая запускается на машинах локально.Столкнулся с проблемой парсера, а именно проблемы с ie, на тех пк, на которых ie никогда не открывались, не пройдена первоначальная настройка, естественно парсер говорит об этом. Если зайти в ie и согласится с настройками то скрипт отрабатывает корректно. Есть ли какая-нибудь команда, чтобы запустить парсер без первоначальной настройки?
скрипт
Код:

param (
#[parameter(Mandatory=$true)]
$encode = 65001,
[string]$outfile = 'D:\distr\table.csv',
[int]$number = 1
)



Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' |
select @{n='Имя пк';e={$_.macaddress}}| convertto-csv -d ';' -notype|
out-file $outfile -enc utf8


$ofs = ''
gwmi wmimonitorid -Namespace root\wmi |
Select @{n='UserFriendlyName';e={
        ([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)
}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} | convertto-csv -d ';' -notype|
out-file $outfile -enc utf8 -app


D:\distr\SnmpWalk\SnmpWalk.exe -v:2c -c:gkj[jt50cjj,otcndj -os:1.3.6.1.2.1.47.1.1.1.1.2.0 -op:1.3.6.1.2.1.47.1.1.1.1.2.1 -r:10.83.3.1 -csv|
out-file $outfile -enc utf8 -app


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'
$ips = 130..190 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|sort
$ips|%{
        if (test-connection $_ -count 1 -q){
                try{
                        $html = iwr $_
                        $tables = $html.parsedhtml.getelementsbytagname("table")
                        $tbl = ($tables|?{($_.getelementsbytagname('table')|
                        %{$_}).count -eq 0})[$number]|%{
                                $headers = @();
                                $tr = $_|%{$_.getelementsbytagname("tr")}
                                if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
                                %{$_.getelementsbytagname("th")}|select -exp innertext){
                                        if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
                                        $headers = $headers.trim()
                                } else {
                                        $headers = 1..([linq.parallelenumerable]::max(
                                                [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
                                        )+1)|%{"H$_"}
                                }
                                $rowind = ,1 * $headers.count
                                $tr.where({$_.firstchild().tagname -eq 'td'})|%{
                                        $row = $_.getelementsbytagname("td") |? innertext -ne $null|
                                        select innertext,rowspan,colspan
                                        if($row.innertext -match [char]208){
                                                for($i=0;$i -lt $row.count;$i++){
                                                        $row[$i].innertext = $row[$i].innertext|convert $encode 28591
                                                }
                                        }
                                        $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
                                                                          } else {$tbl[([array]::indexof($tbl.h1,'Model Number'))].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}
                               
                        }
                } catch {
                        write-host Ошибка: $_ -for red
                }
        }
} | convertto-csv -d ';' -notype|out-file $outfile -enc utf8 -app

запускается планировщиком и складывает инфу в файлик на диске. Естественно на компах никто никогда не заходил в ie от локального админа и поэтому настройка не завершена. Использовать срипт с парсером из powerhtml тоже нет возможности, этот модуль отсутствует на win10 по умолчанию, интернет урезан и модуль не установить командой, только если его копировать и ставить как-то командами, вписать это в скрипт. Кто что думает как возможно решить задачу?

YuS_2 14-05-2020 16:40 2921126

Цитата:

Цитата Griboed0ff
Если зайти в ie и согласится с настройками то скрипт отрабатывает корректно. Есть ли какая-нибудь команда, чтобы запустить парсер без первоначальной настройки? »

Нет, этот парсер напрямую завязан на ie, без него работать не будет...

Цитата:

Цитата Griboed0ff
Использовать срипт с парсером из powerhtml тоже нет возможности, этот модуль отсутствует на win10 по умолчанию, интернет урезан и модуль не установить командой, только если его копировать и ставить как-то командами, вписать это в скрипт. Кто что думает как возможно решить задачу? »

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

Griboed0ff 14-05-2020 16:44 2921127

Цитата:

Цитата YuS_2
ставил пару модулей простым копирование, вроде работают без проблем. »

Пробовал и как раз проблема, что политикой не дает не подписанный модуль запустить. Буду пока искать инфу на счет настройки ie через cmd, почему то думаю, что поставить галочку "использовать рекомендуемые настройки" командой возможно...

скорее всего это будет подмена ветки реестра, пока все мысли на это указывают

Griboed0ff 14-05-2020 17:00 2921129

Цитата:

Цитата YuS_2
модуль локально... »

все же попробую на нескольких машинах, политики для разных аушек могут быть разными.

Griboed0ff 06-06-2020 19:58 2924225

Цитата:

Цитата YuS_2
модуль локально... »

получилось ставить локально, но как всегда есть проблемки, а именно:
Скрытый текст
Код:

PS D:\local> D:\local\localphone.ps1
Ошибка: Невозможно выполнить анализ содержимого отклика, так как подсистема Internet Explorer недоступна или настройка
 при первом запуске Internet Explorer выполнена не полностью. Укажите параметр UseBasicParsing и попробуйте еще раз.
Ошибка: Невозможно выполнить анализ содержимого отклика, так как подсистема Internet Explorer недоступна или настройка
 при первом запуске Internet Explorer выполнена не полностью. Укажите параметр UseBasicParsing и попробуйте еще раз.
Ошибка: Невозможно выполнить анализ содержимого отклика, так как подсистема Internet Explorer недоступна или настройка
 при первом запуске Internet Explorer выполнена не полностью. Укажите параметр UseBasicParsing и попробуйте еще раз.

Получается запускается скрипт от пользователя, который никогда не заходил в IE. МБ запускать от пользака, который точно пользуется ie. Но проблема в том, первая часть скрипта требует админских прав, а парсеру на айпишки нужны настройки для ie. Была надежда, что при использовании powerhtml не нужен будет ie.


Время: 10:28.

Время: 10:28.
© OSzone.net 2001-