Powershell: скрининг http и возврат определенных строк в качестве переменных - PullRequest
2 голосов
/ 05 августа 2011

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

$Yesterday = [DateTime]::Now.AddDays(-1)
$datestr = $Yesterday.ToString("dd-MMM-yyyy")
$WebClient = New-Object System.Net.WebClient
$Results = $WebClient.DownloadString("http://fakeurl")

Это приводит к большому объему вывода, содержащему http-кода также данные, которые меня интересуют, но все они сгруппированы вместе.Затем я делаю это:

[StringSplitOptions]$option = "None"
[string[]]$separator = "</td>"
$SPL = $Results.Split($separator, $option)

Это разбивает данные в более читаемый формат.Вот фрагмент интересующего меня раздела из $ SPL.

<tr><td headers="HOST_NAME" class="t13dataalt">server01
<td headers="AUTOSYS_JOB" class="t13dataalt">nbu.os.wn.135b.server01
<td headers="START_TIME" class="t13dataalt">01-Aug-2011 21:23
<td headers="END_TIME" class="t13dataalt">01-Aug-2011 21:51
<td headers="BACKUP_TYPE" class="t13dataalt">differential
<td headers="SCHEDULE" class="t13dataalt">daily
<td align="right"  headers="SIZE_MB" class="t13dataalt">       2,091.18
<td headers="IMAGES" class="t13dataalt">1
<td headers="EXIT_STATUS" class="t13dataalt">0
</tr><tr><td headers="HOST_NAME" class="t13data">server02
<td headers="AUTOSYS_JOB" class="t13data">nbu.os.wn.135b.server02
<td headers="START_TIME" class="t13data">31-Jul-2011 21:22
<td headers="END_TIME" class="t13data">31-Jul-2011 21:41
<td headers="BACKUP_TYPE" class="t13data">differential
<td headers="SCHEDULE" class="t13data">daily
<td align="right"  headers="SIZE_MB" class="t13data">       2,496.31
<td headers="IMAGES" class="t13data">1
<td headers="EXIT_STATUS" class="t13data">0

Из этого мне нужно извлечь время начала и окончания, отработать истекшее время, а также вернуть EXIT_STATUS длясамая последняя резервная копия.Я пробовал следующее, но я чувствую, что могу лаять не то дерево:

$Position = select-string -inputobject $SPL -pattern $datestr

$ Position.matches приводит к:

PS C:\Scripts> $Position.matches

Groups   : {03-Aug-2011}
Success  : True
Captures : {03-Aug-2011}
Index    : 12056
Length   : 11
Value    : 03-Aug-2011

Моя теория заключалась в том, чтобы сделать подстрокуиспользуя индекс, добавленный к длине, чтобы извлечь значение времени после даты, но я понятия не имею, как это сделать.Я также думаю, что это немного примитивно.Должен быть более простой способ вернуть нужную мне строку информации из этой переменной, не считая до места, а затем вырвав остальную часть строки?


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

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

# Get yesterdays date and convert it to the required search format
    $Yesterday = [DateTime]::Now.AddDays(-1)
    $datestr = $Yesterday.ToString("dd-MMM-yyyy")

# Scrape the webpage
    $url = "http://fake-url"
    $WebClient = New-Object System.Net.WebClient
    $Results = $WebClient.DownloadString($url)

# Determine if the previous day is listed in the backups
    $IsDateThere = $Results.Contains($datestr)
        If ($IsDateThere){
            # split the data into rows
            [StringSplitOptions]$option = "None"
            [string[]]$separator = "</td>"
            $SPL = $Results.Split($separator, $option)

            #strip the data into a hash table
            $SPL | 
                Foreach-Object {
                    where {$_ -match 'headers="(.*)" class.*>(.*)'} |
                        ForEach-Object { 
                        @{
                                $matches[1] = ($matches[2]).trim() 
                            }
                        }
                }           
        }
        Else{
            Write-Host "Yesterday's date not found"
        }

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

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Я бы подошел примерно так:

$html = @"
<tr><td headers="HOST_NAME" class="t13dataalt">server01
<td headers="AUTOSYS_JOB" class="t13dataalt">nbu.os.wn.135b.server01
<td headers="START_TIME" class="t13dataalt">01-Aug-2011 21:23
<td headers="END_TIME" class="t13dataalt">01-Aug-2011 21:51
<td headers="BACKUP_TYPE" class="t13dataalt">differential
<td headers="SCHEDULE" class="t13dataalt">daily
<td align="right"  headers="SIZE_MB" class="t13dataalt">       2,091.18
<td headers="IMAGES" class="t13dataalt">1
<td headers="EXIT_STATUS" class="t13dataalt">0
</tr><tr><td headers="HOST_NAME" class="t13data">server02
<td headers="AUTOSYS_JOB" class="t13data">nbu.os.wn.135b.server02
<td headers="START_TIME" class="t13data">31-Jul-2011 21:22
<td headers="END_TIME" class="t13data">31-Jul-2011 21:41
<td headers="BACKUP_TYPE" class="t13data">differential
<td headers="SCHEDULE" class="t13data">daily
<td align="right"  headers="SIZE_MB" class="t13data">       2,496.31
<td headers="IMAGES" class="t13data">1
<td headers="EXIT_STATUS" class="t13data">0
"@

$html -split "`r`n" | where {$_ -match 'start_time|end_time'} |
    ForEach {
        $pos = $_.IndexOf("headers")
        $begin = $pos+9
        $end = $_.IndexOf('"', $begin)

        new-object PSObject -Property @{
            Key   = $_.SubString($begin, $end-$begin)
            Value = Get-Date( $_.SubString( $_.IndexOf(">")+1 ) )
        }
    }

Результаты

Key        Value               
---        -----               
START_TIME 8/1/2011 9:23:00 PM 
END_TIME   8/1/2011 9:51:00 PM 
START_TIME 7/31/2011 9:22:00 PM
END_TIME   7/31/2011 9:41:00 PM
1 голос
/ 05 августа 2011

это не оригинальный ответ - просто альтернативная версия того, как Дуг использует reg ex для сбора всех данных:

$html -split "`n" | where {$_ -match 'headers="(.*)" class.*>(.*)'} |
    % { 
        @{
                $matches[1] = ($matches[2]).trim() 
            }
    }

РЕДАКТИРОВАТЬ: используя код в вопросе:

$Yesterday = [DateTime]::Now.AddDays(-1)
$datestr = $Yesterday.ToString("dd-MMM-yyyy")
$WebClient = New-Object System.Net.WebClient
$Results = $WebClient.DownloadString("http://fakeurl")

[StringSplitOptions]$option = "None"
[string[]]$separator = "</td>"
$SPL = $Results.Split($separator, $option)

$SPL | 
    Foreach-Object {
        where {$_ -match 'headers="(.*)" class.*>(.*)'} |
            % { 
            @{
                    $matches[1] = ($matches[2]).trim() 
                }
            }
    }

РЕДАКТИРОВАТЬ 2:

    $SPL | 
        Foreach-Object {
            where {$_ -match 'headers="(.*)" class.*>(.*)'} |
                % { 
if (($matches[2]).trim() -eq $datestr ) { "$($matches[1]) is yesterday's back up" }
                }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...