Powershell从.txt文件获取链接,获取源代码,获取字符串,导出到csv

时间:2012-12-15 16:10:09

标签: powershell csv foreach get-childitem

按顺序,我必须:
1)从txt文件中获取所有链接

  

http://example1.htm
http://example2.htm
http://example3.htm
...

2)从每个链接获取来源
3)从源头获取我的字符串 4)将字符串导出到csv

它适用于一个链接。例如:

$topic1 = "kh_header.><b>((?<=)[^<]+(?=</b>))"
$topic2 = "<b>Numer ogłoszenia:\s([^;]+(?=;))"
 Select-String -Path strona1.htm -pattern $topic1 | foreach-object {
 $_.line -match $topic1 > $nul
 $out1 = $matches[1]
 }
 Select-String -Path strona1.htm -pattern $topic2 | foreach-object {
 $_.line -match $topic2 > $nul
 $out2 = $matches[1]
 }
echo $out1';'$out2';' | Set-content out.csv -force

,但我无法通过txt文件中的许多链接获取它。我试试看:

$topic = "kh_header.><b>((?<=)[^<]+(?=</b>))"
$topic2 = "<b>Numer ogłoszenia:\s([^;]+(?=;))"
 $folder = Get-ChildItem e:\sk\html
  ForEach ($htmfile in $folder){
   If ($_.extension -eq ".htm"){
    $htmfile = ForEach-Object  {
            $WC = New-Object net.webclient
            $HTMLCode = $WC.Downloadstring($_.fullname)
            }
       Select-String -Path $HTMLCode -pattern $topic | foreach-object {
       $_.line -match $topic > $nul
       $out1 = $matches[1]
       }    
       Select-String -Path $HTMLCode -pattern $topic2 | foreach-object {
       $_.line -match $topic2 > $nul
       $out2 = $matches[1]
       }      
       echo $out1';'$out2';' | Set-content out.csv -force     
    }
}

我怎样才能得到它?

1 个答案:

答案 0 :(得分:1)

默认情况下使用Select-String时,它只会查找任何特定行的第一个匹配项。您可以使用AllMatches参数来解决这个问题,例如:

foo.txt contains: "static void Main(string[] args)"

Select-String foo.txt -pattern '\W([sS]..)' -AllMatches | 
    Foreach {$_.Matches} |
    Foreach {$_.Groups[1].Value}

此外,Select-String是面向行的,因此它不会在行之间找到模式匹配。为了找到这些,你需要在文件中读取一个字符串,例如:

$text = [io.file]::readalltext("$pwd\foo.txt")

然后使用一些特殊的正则表达式指令,例如:

$text | Select-String -pattern '(?si)\W([sS]..)' -AllMatches |
        Foreach {$_.Matches} |
        Foreach {$_.Groups[1].Value}