首页 > 解决方案 > 执行invoke-webrequest以获取Powershell中多个网站的状态

问题描述

我们有几个网站,我不想invoke-webrequest -URI google.com每次都检查 powershell 中的状态。

我起草了这样的东西,但它不起作用,我需要帮助:

$URLS = get-content c:\websitesaddress.txt
Invoke-webrequest -URI $urls |statuscode | export-csv c:\status.csv

我想检查几个网页的状态并将其导出为 CSV 格式website name, statuscode

标签: powershellurliisweb-administrationhttp-status-code-200

解决方案


您离答案不远了,您只需要获取 Invoke-WebRequest 调用的 statuscode 属性,如下所示:

Invoke-webrequest -URI $url | select statuscode

或者

$(Invoke-webrequest -URI $url).statuscode

如果将其通过管道传输到Export-Csvcmdlet,您只会获得状态码,而不是 url,而且需要在每个循环上附加文件,因为它每次都会重新创建文件,只显示文件中最后一个 url 的状态码。

我在下面展示了两种可能的方法:

简单的文件写入

这种方法并不是最干净的,它不使用Export-Csvcmdlet

$urls = Get-Content C:\webSiteAddress.txt

# Add the header to the file
Set-Content "C:\status.csv" -Value "URL,Status"
foreach($url in $urls)
{
    $status = $(Invoke-webrequest -URI $url).statuscode
    # Create the data line
    $line = "$url,$status"
    # Append the data to the file
    Add-Content "C:\status.csv" $line
}

导出并附加到 CSV

使用Export-Csv稍微复杂一点,因为Export-Csv期望和对象具有属性作为它的列。在每个循环中,您将进程告知-Append现有 CSV,这样数据就不会在进程中丢失。

# Remove the file if it exists already
if ([System.IO.File]::Exists("C:\status.csv")) {Remove-Item "C:\status.csv"}

# Get the web addresses
$urls = Get-Content "C:\webSiteAddress.txt" 

# Loop over the URLs
foreach($url in $urls) {
    # Create a new object containing the url and the statuscode property
    # of an Invoke-WebRequest call. Choose the column names here by changing url,status
    New-Object PSObject -Property @{
    url=$url;
    status=$(Invoke-webrequest -URI $url).statuscode
    } | 
    export-csv "C:\status.csv" -Append -NoTypeInformation
}

第二种方法更可取,因为它正确引用了 CSV 中的值,从而防止了任何数据完整性问题。


推荐阅读