2011-08-05 2 views
2

저는 PowerShell을 처음 접했고 지식에 한계가 있습니다. 내부 웹 페이지에서 백업 데이터를 긁어 내고 긁힌 자국에서 정보를 추출하여 조작하고 나중에 Excel에 표시하는 스크립트를 작성하고 있습니다.Powershell : http 스크린 스크랩 및 특정 라인을 변수로 반환

$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에 관심이있는 섹션의 스 니펫입니다. 내가 경과 시간을 작업 시작 및 종료 시간을 추출하고, 또한 가장 최근의 백업의 EXIT_STATUS를 반환해야이에서

<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 

. 나는 다음을 시도했지만 내가 잘못된 트리 짖는 할 수있다 느낌 :

PS C:\Scripts> $Position.matches 

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

내 이론은 색인을 추가하여 문자열을했다 :

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

$ Position.matches는 결과를 날짜까지 시간 값을 추출하는 길이로하지만 나는 그 방법을 모릅니다. 나는 또한 조금 원시적이라고 생각한다. 그 변수에 필요한 정보의 줄을 그 자리까지 세지 않고 나머지 줄을 빼내는 쉬운 방법이 있어야합니다.


페이지 하단에 섹션을 추가하는 방법을 잘 모르겠습니다. 여기에 추가 할 예정입니다.

이것은 현재 내 스크립트이며 오류없이 실행되지만 결과는 반환되지 않습니다.

# 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" 
     } 

아이디어가 있으십니까? 가장 최근 백업의 시작 시간과 종료 시간 및 종료 코드를 변수로 사용하려면 다음해야 할 일을 잘 모릅니다.

답변

3

나는이

$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

이는 orginal 한 대답하지 않습니다처럼 뭔가에 접근하는 것 - 더그의 사용 등록의 전 단지 다른 버전의 모든 데이터를 캡처 :

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

수정 : 코드를 사용하여 questi 에 :

$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" } 
       } 
     } 
+0

감사합니다. 나는 이것을 오늘 시험 할 것이고 내가 어떻게 일어나는지 알려줄 것이다. $ SPL 변수를 위의 문자열 대신 해시 테이블에 전달할 수 있습니까[email protected] Finke – jok5r

+0

그래, 그뿐 아니라 잘 작동합니다 (내가 어떻게 작동하는지 믿을 수있는 방법을 보여주기 위해 바꿀 것입니다) – Matt

+0

대답 아래의 원래 질문에 어떻게 확장합니까? – jok5r