none
Командлет Out-GridView не выводит сведения RRS feed

  • Вопрос

  • Здравствуйте, уважаемое сообщество!

    Столкнулся с непонятной для меня ситуацией: PoSh-скриптом выбираю с нескольких страниц сайта однотипные таблицы, создаю массив объектов, свойства которых соответствуют строкам левого столбца этих таблиц (они едины для всех вэб-страниц), а значения -- соответствующим строкам правого столбца. Все свойства объектов заполнены корректно и в консоли я могу их просмотреть, но при передаче этого массива по конвейеру в Out-GridView, выводится только столбец 'Name', который я заполняю, условно говоря, "руками". Значения свойств объектов, полученных с сайта, в таблице Out-GridView пустые(((

    Привожу сам скрипт:

    $bdus = [regex]::Matches((Get-Clipboard),'BDU:\d{4}-\d{5}').value

    $Result = @()

    $bdus | `

        %{  

            $ht = [ordered]@{}

            $ht.Name = $_

            $url = "https://bdu.fstec.ru/vul/{0}" -f ($_ -replace 'BDU:(.+)','$1')

            $wpage = Invoke-WebRequest $url

            $vul = $wpage.ParsedHtml.GetElementsByTagName('TABLE')[0]

            $vul.rows | %{$ht.($_.Cells[0].InnerText) = $_.Cells[1].InnerText}

            $Result += New-Object -TypeName:psobject -Property:$ht

         }

    $Result | Out-GridView

    Грешил на кодировку (сайт, как водится UTF-8), пробовал так:

    $encodingclass = [System.Text.Encoding]

    $wpencoding = $encodingclass::GetEncoding('utf-8')

    $OutEncoding = $encodingclass::GetEncoding('windows-1251')

    $bdus = [regex]::Matches((Get-Clipboard),'BDU:\d{4}-\d{5}').value

    $Result = @()

    $bdus | `

        %{  

            $ht = [ordered]@{}

            $ht.Name = $_

            $url = "https://bdu.fstec.ru/vul/{0}" -f ($_ -replace 'BDU:(.+)','$1')

            $wpage = Invoke-WebRequest $url

            $vul = $wpage.ParsedHtml.GetElementsByTagName('TABLE')[0]

            $vul.rows | %{$ht.($_.Cells[0].InnerText) = $OutEncoding.getstring($encodingclass::Convert($wpencoding, $OutEncoding, $OutEncoding.GetBytes($_.Cells[1].InnerText)))}

            $Result += New-Object -TypeName:psobject -Property:$ht

         }

    $Result | Out-GridView

    , но тщетно(((

    Понимаю, что ошибка у меня, скорее всего, в ДНК))), но хотелось бы разобраться где конкретно...

    Прошу Вашей помощи!

    27 марта 2023 г. 9:19

Ответы

  • Проблема решена, ошибка найдена!

    На форумах powershell.org пользователь ZaMotH привел текст своего скрипта, решающего схожую задачу. Я заметил одну малюуууууусенькую, но весьма существенную разницу между нашими вариантами: он "тримил" строки, выдираемые с сайта (метод Trim() объекта [String]). Добавил это сюда:

    $vul = $wpage.ParsedHtml.GetElementsByTagName('TABLE')[0] 
    $vul.rows | %{$ht.($_.Cells[0].InnerText.Trim()) = $_.Cells[1].InnerText} 
    $Result += New-Object -TypeName:psobject -Property:$ht

    и аллилуя!!!

    Самый прикол, что я видел в конце имен свойств пробел, но не придал этому значения((( Век живи...



    • Изменено Drew53 31 марта 2023 г. 7:18
    • Помечено в качестве ответа Drew53 31 марта 2023 г. 7:22
    31 марта 2023 г. 7:17

Все ответы

  • Привет,

    Вы можете изучить некоторые ограничения этой команды.

    Этот командлет доступен только на платформах Windows.

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

    Выходные данные команды, отправляемые в Out-GridView, нельзя форматировать с помощью командлетов Format, таких как командлеты Format-Table или Format-Wide. Чтобы выбрать свойства, используйте командлет Select-Object.

    Командлет Out-GridView отправляет выходные данные команды в окно представления сетки, где выходные данные отображаются в интерактивной таблице. Поскольку для этого командлета требуется пользовательский интерфейс, он не работает в Windows Server Core или Windows Nano Server.


    Надеюсь, это разрешит ваш запрос !!

    --Если ответ полезен, проголосуйте и примите его как ответ--
    28 марта 2023 г. 15:02
  • Здравствуйте!

    Большое спасибо, что открыли мне глаза на тонкости применения командлета, но это все может быть (и, собственно, было) прочитано в "get-help out-gridview - full")))

    Нет! К сожалению, ничего из упомянутого не относится к данной ситуации...

    30 марта 2023 г. 6:39
  • а нечего с ботом разговаривать :-)

    покажите что у вас приезжает с конвеера

    $result[0]|gm

    30 марта 2023 г. 10:11
  • У Вас  Invoke-WebRequest как минимум не выполниться, так как не валидный сертификат на сайте. Либо сертификат поправить, либо искать решения по игнору его в запросе.
    30 марта 2023 г. 20:15
  • Да нее... Все работает! В рабочей сети лезу через прокси -- он перешифровывает хттпс своим сертификатом, Invoke-WebRequest даже не замечает. Напрямую -- да: сначала не хотел работать. Открыл сайт в браузере, сказал касперу, чтоб не ругалсо, мол я все понимаю и хочу продолжить))), и Invoke-WebRequest тоже заработал. Может еще и браузеру сказал, что мне пофиг, не помню, но, в принципе, скрипт отрабатывает...
    31 марта 2023 г. 7:00
  • Про бота что-то не подумал))) С конвеера приезжает, как надо! Я ж говорю: в консоли у всех объектов нужные свойства с нужными значениями и их можно посмотреть. Проблема была с отображением в "гриде". Щас ниже напишу, в чем загвоздка была...
    31 марта 2023 г. 7:07
  • Проблема решена, ошибка найдена!

    На форумах powershell.org пользователь ZaMotH привел текст своего скрипта, решающего схожую задачу. Я заметил одну малюуууууусенькую, но весьма существенную разницу между нашими вариантами: он "тримил" строки, выдираемые с сайта (метод Trim() объекта [String]). Добавил это сюда:

    $vul = $wpage.ParsedHtml.GetElementsByTagName('TABLE')[0] 
    $vul.rows | %{$ht.($_.Cells[0].InnerText.Trim()) = $_.Cells[1].InnerText} 
    $Result += New-Object -TypeName:psobject -Property:$ht

    и аллилуя!!!

    Самый прикол, что я видел в конце имен свойств пробел, но не придал этому значения((( Век живи...



    • Изменено Drew53 31 марта 2023 г. 7:18
    • Помечено в качестве ответа Drew53 31 марта 2023 г. 7:22
    31 марта 2023 г. 7:17