2014-09-10 40 views
0

我想使用Powershell搜索.html文檔中的特定字符串並將其打印出來。搜索並打印出Powershell中的.html數據信息

讓我解釋一下我的第一個函數: 我使用這個函數來搜索包含字符串「Tag」的路徑中的所有.html文檔。之後,我搜索字符串「ID:」,跳過標籤"</TD><TD>"並使用以下正則表達式打印出以下32個字符,即ID。下面你會看到一部分html文件,然後是我的功能。

<TR VALIGN=TOP><TD>Lokation:</TD><TD>\Test1\blabla\asdf\1234\WS Auswertungen</TD></TR> 
<TR VALIGN=TOP><TD>Beschreibung:</TD><TD></TD></TR> 
<TR VALIGN=TOP><TD>Eigentümer:</TD><TD><IMG ALIGN=MIDDLE SRC="file:///C:\Users\D0262290\AppData\Local\Temp\23\User.bmp">&nbsp;Wilmes, Tanja</TD></TR> 
<TR VALIGN=TOP><TD>ID:</TD><TD>55C7B7F411E2661E001000806C38EBA0</TD></TR> 
</TABLE></TD><TD><IMG ALIGN=MIDDLE SRC="file:///C:\Users\D0262290\AppData\Local\Temp\23\User.bmp">&nbsp; 

功能:

Function searchStringID { 
    Get-ChildItem -Path C:\Users\blub\lala\Dokus -Filter *.html | 
    Select-String -Pattern "Tag" | 
    select Path | 
    Get-ChildItem | 
    foreach { 
     if ((Get-Content -Raw -Path $_.FullName) -replace "<.*?>|\s" -match "(?s)ID:(?<Id>[a-z0-9]{32})") { 

      printToOutputLog 
     } 
    } 
} 

這一切工作正常。

現在我需要檢查2個更多的信息,我無法弄清楚我必須使用的正則表達式,因爲它沒有固定長度的字符。 我總是要檢查下面我的問題中的字符串「標記」。

我的第一個問題: 我已經得到了文件的位置,所以我需要搜索字符串「Lokation:」(你可以在我之前發佈的html上檢查它)。 因此,獲取我必須再次跳過標籤</TD><TD>的信息並使用正則表達式來獲取位置。我的問題在於,我必須瞭解如何管理不固定的字符長度。有沒有辦法打印「Lokation:</TD><TD>」和"</TD></TR>"之間的字符? 這些標籤在其他html文件中都是相同的,所以我只需要一個適用於我的示例的解決方案。

我的第二個問題: 我必須讀出對象的名稱。在html文檔中,它像這樣存儲在評論中。該對象的名字從「[OBJECT:]」開始並以「]」結尾,在這裏再次,我不知道我可以使用哪種表達式,可以使用下面示例對象名稱中的特殊字符。

<!-- ################################################################## --> 
<!-- # [OBJECT: NAME BLA bla/ BLA_BLA 1 22:34] # --> 
<!-- ################################################################## --> 

我會很感激,如果有人可以幫助我。因爲我的大腦是真正堅持在這裏的每一絲對我來說非常有用。 感謝和歡呼聲

+0

[你不能解析與正則表達式HTML(HTTP:/ /stackoverflow.com/a/1732454/1324345) – alroc 2014-09-10 15:40:39

回答

0

好吧,這一個獲取每個文件的內容,並通過運行在每個行一個Switch與三個RegEx表達式匹配,它可以幫助我處理樣本數據,它將每個匹配分配給您正在查找的三件事中的每一件的變量,然後爲每件事輸出一個對象

Function searchStringID { 
    Get-ChildItem -Path C:\Users\blub\lala\Dokus -Filter *.html | 
    Select-String -Pattern "Tag" | 
    select Path | 
    Get-ChildItem | 
    foreach { 
     Switch -Regex (Get-Content -Path $_.FullName){ 
      "((?<=ID:.+?)[a-z0-9]{32})" {$ID = $Matches[1]} 
      "Lokation:.+?>(\\[^<]+)" {$Location = $Matches[1]} 
      "OBJECT: ?([^\]]+)"  {$Object = $Matches[1]} 
     } 
     [PSCustomObject][Ordered]@{ 
      'ID' = $ID 
      'Location' = $Location 
      'Name' = $Object 
     } 
    } 
} 

那麼你可以將它分配給一個變量,並有一個結果數組來處理(輸出到CSV?當然!作爲表格顯示在屏幕上?可以做!電郵給整個公司?嗯,是的,但我不會建議)

下面是它給了我,當我跑這對你的樣品:

ID                  Location                Name                 
--                  --------                ----                 
55C7B7F411E2661E001000806C38EBA0          \Test1\blabla\asdf\1234\WS Auswertungen        NAME BLA bla/ BLA_BLA 1 22:34 
+0

謝謝! 無法想象解決方案會如此簡單。 這正是我想要的輸出。 – Elaice 2014-09-11 11:41:59