Проблемы при разборе файла журнала в конвейере PowerShell

309
Alexamation
(new-object System.Net.WebClient).DownloadFile('http://192.168.100.1/cgi-bin/status_cgi','C:\file.txt') 

получает страницу состояния с модема Arris.

select-string -Path "C:\file.txt" -pattern "Uptime" 

выходы:

C:\file.txt:96:<tbody><tr><td width="160">System Uptime: </td><td>0 d: 18 h: 33 m</td></tr> 

как и ожидалось, но

(new-object System.Net.WebClient).Downloadstring('http://192.168.100.1/cgi-bin/status_cgi') | select-string -pattern 'Uptime' 

печатает всю страницу и не выбирает строку

Запрос потока вывода из Webclient также не будет "труба"

(new-object System.Net.WebClient).openread('http://192.168.100.1/cgi-bin/status_cgi') | select-string -pattern 'Uptime' 

Что мне не хватает?

1
Вы должны разделить возвращенную строку с помощью оператора `-split` ->` (new-object System.Net.WebClient) .openread ('http://192.168.100.1/cgi-bin/status_cgi') -split. "` r? `n" | select-string -pattern 'Uptime'` LotPings 5 лет назад 1

1 ответ на вопрос

-1
maoizm

Когда вы передаете выходные данные System.Net.WebClientв Select-String, выходные данные обрабатываются как одна строка, поэтому выходные данные совпадают как единое целое.

Когда вы сохраняете выходные данные System.Net.WebClientв файл, а затем читаете его, используя Select-String -Path path/to/the/file, Select-String обрабатывает содержимое файла как массив строк и возвращает только строки, соответствующие шаблону.

К вашему сведению: в Powershell 3+ удобнее использовать командлет Invoke-WebRequest :

$uri = 'http://192.168.100.1/cgi-bin/status_cgi' (Invoke-WebRequest -Uri $uri).Content -split "`n" | Select-String -SimpleMatch Uptime 

Рекомендации: