【问题标题】:Powershell script to determine if web page existsPowershell脚本确定网页是否存在
【发布时间】:2019-12-08 04:07:30
【问题描述】:

我需要一种方法来从 PS 脚本中确定任何网页是打开还是关闭,无论它是否首先提示输入凭据。即使页面需要安装 java 或其他任何原因。这里的目标是确定页面是否存在,它是否正常工作或是否可以显示都无关紧要。毕竟,它应该只是告诉我在使用 .\sitecheck.ps1 'https://trac.edgewall.org/login' 执行脚本后站点/页面是 UP 还是 DOWN

如果我们可以打印页面关闭的原因(例如当您收到 401 错误时)并打印错误消息和状态代码(整数),那就太好了。

我正在尝试解决这个显然无法正常工作的脚本,因为我正在尝试寻找解决方案:

# First we create the request.
$url = $args[0]
$HTTP_Request = [System.Net.WebRequest]::Create($url)

# We then get a response from the site.

$HTTP_Response = $HTTP_Request.GetResponse()

# We then get the HTTP code as an integer.
$HTTP_Status = [int]$HTTP_Response.StatusCode

If ($HTTP_Status -eq 200) {
    Write-Host "Site is OK!"
}
Else {
    Write-Host "The Site may be down, please check!"
}

# Finally, we clean up the http request by closing it.
If ($HTTP_Response -eq $null) { } Else { $HTTP_Response.Close()}

有人在此网站上回答了类似问题:

"如果 URL 需要凭据,您需要添加 $HTTP_Request.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials。您需要在 $HTTP_Response = $HTTP_Request.GetResponse() 行周围添加 Try..Catch,如果失败, $HTTP_Response 将为空,因此无法关闭,因为它已经为空 - 就像当您收到 (404) Not Found 时,您将没有响应并且错误将是您无法在 null 上调用方法-valued 表达式,如果您尝试对其执行 .Close()。"

不幸的是,我不知道该怎么做。目前我收到以下错误。大多数实际错误消息都是准确的,因为我没有输入正确的凭据,因此出现 401 错误代码:

使用“0”参数调用“GetResponse”的异常:“远程 服务器返回错误:(401)未经授权。”在 C:\Users\test\sitecheck.ps1:11 char:1 + $HTTP_Response = $HTTP_Request.GetResponse() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException

【问题讨论】:

  • 登录后您只会收到200。如果您还没有登录,不要指望 200。但是您可以检查svn.edgewall.com 是否已启动。我相信是提供登录的服务

标签: powershell


【解决方案1】:

不要因为您尚未访问该页面而期望收到200。看,我什至可以点击你在 StackOverflow 上发布的超链接:在访问页面之前,横幅要求登录(我还没有访问过该页面)

然后,因为我没有凭据,所以我收到的是 401 Unauthorized

所以我建议您检查 Apache Subversion 是否已启动并运行:

# First we create the request.
$url = $args[0]
$HTTP_Request = [System.Net.WebRequest]::Create('https://svn.edgewall.org')

# We then get a response from the site.
$HTTP_Response = $HTTP_Request.GetResponse()

# We then get the HTTP code as an integer.
$HTTP_Status = [int]$HTTP_Response.StatusCode

If ($HTTP_Status -eq 200) {
    Write-Host "Site is OK!"
}
Else {
    Write-Host "The Site may be down, please check!"
}

# Finally, we clean up the http request by closing it.
If ($HTTP_Response -eq $null) { } Else { $HTTP_Response.Close()}

**

编辑:

**

在您发表评论后,我为您找到了解决方案here

将此代码粘贴到.ps1 文件中并像图片中那样执行:

$url = $args[0]

try {
  $HttpWebResponse = $null;
  $HttpWebRequest = [System.Net.HttpWebRequest]::Create($url);
  $HttpWebResponse = $HttpWebRequest.GetResponse();
  if ($HttpWebResponse) {
    Write-Host -Object $HttpWebResponse.StatusCode.value__;
    Write-Host -Object $HttpWebResponse.GetResponseHeader("X-Detailed-Error");
  }
}
catch {
  $ErrorMessage = $Error[0].Exception.ErrorRecord.Exception.Message;
  $Matched = ($ErrorMessage -match '[0-9]{3}')
  if ($Matched) {
    Write-Host -Object ('HTTP status code was {0} ({1})' -f $HttpStatusCode, $matches.0);
  }
  else {
    Write-Host -Object $ErrorMessage;
  }

  $HttpWebResponse = $Error[0].Exception.InnerException.Response;
  $HttpWebResponse.GetResponseHeader("X-Detailed-Error");
}

此脚本将始终为您打印页面的状态代码。所以现在当你定位到https://trac.edgewall.org/login 时,它会返回 401,这是正确的状态码。

您可以在此处查看所有错误代码的列表:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

【讨论】:

  • 是的,我知道这是问题的一部分,你说得对,登录后我只会收到 200 个。但无论我是否登录,我都不知道如何让它工作。抱歉,我需要查看代码,因为我不知道如何编写它以使其适用于任何页面。我不知道您所说的 Apache Subversion 是什么意思,即使我知道了,我也可能不知道如何为它编写代码,因为我不知道如何在 PS 中编程。
  • 此外,该脚本不仅适用于 apache 站点,还适用于任何站点。我认为脚本基本上只需要确认,只要页面响应除了内部错误之外的任何内容,那么站点就会启动,但如果它无法连接或页面由于某些内部错误而关闭,那么它应该说该站点下来了。那么我将如何进行所有这些检查呢?
  • 谢谢弗朗西斯科。效果很好!很好的发现。我遇到的唯一问题是如何以 0 表示成功(网站生成 200 代码)和 1 表示失败(网站没有生成 200)退出脚本。如果你能帮我添加这个就太好了。
  • @yorkman,如果您想打印“200 = OK”和“whatever = Not OK”,您最终将拥有与您在开始时发布的相同的脚本。该脚本实际上打印“站点正常!”当它找到 200 并且“站点可能已关闭,请检查!”对于其他一切。所以你已经有了一个代码。只需替换“网站正常!”带有“0”和“站点可能已关闭,请检查!”带有“1”。完成。
  • 不,我不想打印 200 = OK。我想保持脚本原样,因为它运行良好,唯一的事情是我需要在脚本中添加一个 0 或 1 的退出,具体取决于它确定站点是启动(200)还是关闭。换句话说,如果它是 200,我希望脚本只以 Write-Host “0”退出,如果站点未启动,则以 write-host “1”退出。我只是不知道把这个放在哪里。我是否只是在脚本的末尾添加如下内容: if $HttpStatusCode = 200 {Write-Host "0"} else {Write-Host "1"}?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多