【问题标题】:Search and print out information of .html datas in Powershell在 Powershell 中搜索并打印出 .html 数据的信息
【发布时间】:2014-09-10 23:38:25
【问题描述】:

我想使用 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 条信息,但我无法弄清楚我必须使用的正则表达式,因为它没有固定长度的字符。 我总是必须在下面的问题中检查字符串“Tag”。

我的第一个问题: 我已经得到了文件的位置,所以我必须搜索字符串“Lokation:”(你可以在我之前发布的 html 上查看它)。 因此,获取我必须再次跳过标签&lt;/TD&gt;&lt;TD&gt; 并使用正则表达式来获取位置的信息。我的问题是我必须知道如何管理不固定长度的字符。有没有办法打印出 "Lokation:&lt;/TD&gt;&lt;TD&gt;" 和 "&lt;/TD&gt;&lt;/TR&gt;" 之间的字符? 其他 html 文件中的标签都是相同的,所以我只需要一个适用于我的示例的解决方案。

我的第二个问题: 我必须读出对象的名称。在 html 文档中,它像这样存储在评论中。对象的名称在“[OBJECT:] 之后开始,以“]”结尾。同样,我不知道我可以使用哪个表达式。可以使用下面示例对象名称中的特殊字符。

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

如果有人能帮助我,我将不胜感激。每个提示对我都很有用,因为我的大脑真的卡在这里了。 谢谢和欢呼

【问题讨论】:

标签: powershell search regular-language


【解决方案1】:

好的,这个获取每个文件的内容并通过 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

【讨论】:

  • 谢谢!无法想象解决方案会如此简单。这正是我想要的输出。
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多