Powershell展开属性并添加列

时间:2019-02-19 18:23:40

标签: powershell

我正在尝试创建一个脚本,该脚本将从Invoke-WebRequest cmdlet输出HTTP标头以及请求的URL。

这是我到目前为止所拥有的:

$url = "http://www.example.com"
$a = Invoke-WebRequest -Uri $url | Select-Object -ExpandProperty Headers
$a

这给了我以下输出:

Key              Value                        
---              -----                        
Vary             Accept-Encoding              
X-Cache          HIT, HIT from 10.193.64.18   
Proxy-Connection Keep-Alive                   
Content-Length   1270                         
Cache-Control    max-age=604800               
Content-Type     text/html; charset=UTF-8     
Date             Tue, 19 Feb 2019 16:02:56 GMT
Expires          Tue, 26 Feb 2019 16:02:56 GMT
ETag             "1541025663+ident"           
Last-Modified    Fri, 09 Aug 2013 23:54:35 GMT
Server           ECS (dca/246E)               
Via              SWG

现在,我的目标是最终遍历带有URL的文本文件并输出到CSV进行进一步分析。

要获得有用的数据,我需要将请求的URL作为每个标题键/值的附加列。

我花了几个小时在网上搜索并尝试不同的示例,但收效甚微。

已编辑 根据一些其他搜索找出答案:

$workingdirectory = $PSScriptRoot + '\'
$urlpath = $workdirectory + 'URLs.txt'
$savepath = $workingdirectory + 'output.csv'
$results = @()

foreach($url in Get-Content -Path $urlpath){
    $ht = Invoke-WebRequest -Uri $url | Select-Object -ExpandProperty Headers
    $keys = $ht.keys
    foreach ($key in $keys) {
        $results += New-Object psobject -Property @{'Name'=$key;'Value'=$ht[$key];'URL'=$url}
        }
}

$results | Export-Csv -Path $savepath -NoTypeInformation

哪位会给您类似的信息(当以表格形式显示时):

URL                       Name                             Value                                                                                                                                        
---                       ----                             -----                                                                                                                                        
http://www.example.com/   Vary                             Accept-Encoding                                                                                                                              
http://www.example.com/   X-Cache                          HIT, HIT from 10.193.64.18                                                                                                                   
...                                                                                                                         
http://www.microsoft.com/ Pragma                           no-cache                                                                                                                                     
http://www.microsoft.com/ X-UA-Compatible                  IE=Edge;chrome=1                                                                                                                             
...

2 个答案:

答案 0 :(得分:0)

您已经具有此基础:

$URLs = get-content -path "URLs.txt"
$Output = @()

$Output = foreach ($URL in $URLs) {
    $a = Invoke-WebRequest -Uri $url | Select-Object -ExpandProperty Headers
    $objA = [pscustomobject]$a
    $objA | Add-Member -Type noteproperty -name "URL" -value $URL
    $objA
}

$Output | export-csv -path "CSVFile.csv" -notypeinformation

答案 1 :(得分:0)

这里有一些可以帮助您入门的东西。研究代码,在VSCode或ISE中进行调试,并搜索帮助Get-Help中的新概念。有很多方法可以优化此代码,但是出于学习目的,扩展每个步骤有时会有所帮助。

$uri = @(
    "http://microsoft.com"
    "http://google.com"
    "http://yahoo.com"
    "http://twitter.com"
    )

$out = @()

foreach ($u in $uri)
{
    $h = Invoke-WebRequest -Uri $u | Select -ExpandProperty Headers

    # create hash table/dictionary
    $o = [ordered]@{}

    # add Uri
    $o.Add('Uri', $u)

    # add each Key/Value from $h
    foreach ($k in $h.Keys)
    {
        $o.Add($k, $h[$k])
    }

    # Create psobject from the dictionary
    $p = New-Object psobject -Property $o

    # inefficient to store in $p, but you can see $p in debugger
    $out += $p
}

# create csv
$c = $out | ConvertTo-Csv -NoTypeInformation

# save to csv file?
$c | Out-File -FilePath e:\test.csv

# view csv
notepad.exe E:\test.csv