Я относительно новичок в 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"
}
Есть идеи?Я не уверен, что делать дальше, чтобы получить время начала и время последнего резервного копирования и код выхода в качестве переменных.