Вывод Select-String дает весь объект и не отвечает на фильтр

Я занимался программированием под Unix/Linux, но в последнее время PowerShell стал более полезным в моей работе. Однако отсутствие grep сводит меня с ума. Может кто-нибудь объяснить это явление?

Я пытаюсь вернуть значение IOTA на сегодняшний день к значению, которое я могу Write-Output,

$webpage = Invoke-WebRequest -Uri https://coinmarketcap.com/currencies/iota/
$filtered = $webpage.ParsedHtml.body.innerText

Это дает мне всю необходимую информацию, но требует дополнительной фильтрации.

$filtered | Select-String "IOTA"

Это дает мне всю информацию в $filteredКак-то не удается выделить эту строку. Однако, если я делаю это, это работает:

$filtered > filter.txt
Get-Content filter.txt | Select-String "IOTA"

Я пытался искать в Интернете ответы, самое близкое, что я нашел, это то, что он может обрабатывать $filtered как объект, а не строка. Если я проверяю, он говорит, что это строка.

PS> $ Filter.GetType()

IsPublic IsSerial Name                     BaseType
-------- -------- ----                     --------
True     True     String                   System.Object

Это не мой первый опыт Select-String отказ. Что я делаю неправильно?

2 ответа

Решение

$filtered это одна большая строка. Если вы сохраните $filtered в файл, а затем прочитайте его с помощью get-content, командлет Get-Content вернет содержимое файла в виде массива строк, разделенных символами новой строки.

Однако, поскольку html структурирован, я бы порекомендовал получить интересующий вас элемент, например так:$webpage.parsedhtml.getElementById("quote_price").innerText

возвращает:

3.45 USD

Вместо $filtered | select-string "IOTA"

Ты можешь использовать ($filtered | select-string ".*IOTA.*")

И тогда вы можете выбрать для соответствия результата. В этом случае всегда полезно использовать регулярные выражения. Но я бы порекомендовал вам сначала разделить $ отфильтрованный с помощью новых строк Это уберет запутывание. Тогда продолжай с этим.

Так что это должно быть лучшим вариантом для вас:

(($filtered).Split('`n') | select-string ".*IOTA.*")
Другие вопросы по тегам