Вывод 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.*")