用于确定网页是否存在的Powershell脚本

用于确定网页是否存在的Powershell脚本,powershell,Powershell,我需要一种方法从PS脚本确定任何网页是否处于打开或关闭状态,而不管它是否首先提示输入凭据。即使页面要求安装java或其他任何原因。这里的目标是确定页面是否存在,它是否正常工作或者是否可以显示都不重要。说了这么多,做了这么多之后,它应该告诉我,在使用。\sitecheck.ps1“”执行脚本后,站点/页面是向上还是向下 如果我们可以打印页面关闭的原因(比如当您收到401错误)并打印错误消息和状态代码(整数),那也很好 我正在尝试使用这个脚本,它显然无法正常工作,因为我正在尝试找到一个解决方案: #

我需要一种方法从PS脚本确定任何网页是否处于打开或关闭状态,而不管它是否首先提示输入凭据。即使页面要求安装java或其他任何原因。这里的目标是确定页面是否存在,它是否正常工作或者是否可以显示都不重要。说了这么多,做了这么多之后,它应该告诉我,在使用。\sitecheck.ps1“”执行脚本后,站点/页面是向上还是向下

如果我们可以打印页面关闭的原因(比如当您收到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.CredentialCache=[System.Net.CredentialCache]::DefaultNetworkCredentials。您需要一次尝试..抓住$HTTP_Response=$HTTP_Request.GetResponse()行,如果失败,$HTTP_响应将为null,因此无法关闭,因为它已经为null-就像您得到(404)时一样。”找不到,您将没有响应,错误是如果您尝试对空值表达式执行.Close()操作,则无法对其调用方法。”

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

使用“0”参数调用“GetResponse”时出现异常:“远程 服务器返回错误:(401)未经授权。”位于 C:\Users\test\sitecheck.ps1:11字符:1 +$HTTP\u Response=$HTTP\u Request.GetResponse() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:NotSpecified:(:)[],MethodInvocationException +FullyQualifiedErrorId:WebException


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

然后,因为我没有凭证,所以我收到的是未经授权的
401

因此,我建议您做的是检查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()}
**

编辑:

**

在您的评论之后,我为您找到了一个解决方案:

将此代码粘贴到
.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,这是正确的状态代码


您可以在此处看到所有错误代码的列表:

登录后,您将只收到200。如果你没有登录,不要期望200。但你可以检查一下是否有问题。我相信这是提供登录的服务,我知道这是问题的一部分,你是对的,登录后我只会收到200。但我不知道如何使它工作,无论我是否登录。很抱歉,我需要查看代码,因为我不知道如何编写它,使其与任何页面一起工作。我不知道你所说的Apache Subversion是什么意思,即使我知道了,我也可能不知道如何为它编码,因为我不知道如何用PS编程。此外,该脚本不仅适用于Apache站点,而且适用于任何站点。我认为脚本基本上只需要确认,只要页面响应时没有内部错误,那么站点就启动了,但是如果它无法连接或者页面因为一些内部错误而关闭,那么应该说站点关闭了。那我怎么把这些支票都寄进去呢?谢谢你,弗朗西斯科。太棒了!好发现。我遇到的唯一问题是如何退出脚本,比如0表示成功(站点生成了200代码),1表示失败(站点没有生成200代码)。如果你能帮我添加这个,那就太好了。@yorkman,如果你想打印“200=OK”和“whatever=notOK”,你将得到与开始时发布的相同的脚本。事实上,该脚本在找到200时打印“站点正常!”和“站点可能已关闭,请检查!”以查看其他内容。所以你已经有了代码。只需将“站点正常!”替换为“0”,将“站点可能已关闭,请检查!”替换为“1”。完成。不,我不想打印200=OK。我想让脚本保持原样,因为它工作得很好,唯一的问题是我需要在脚本中添加一个带有0或1的出口,这取决于它确定站点是向上(200)还是向下。换言之,如果是200,我希望脚本以写入主机“0”退出;如果站点未启动,则以写入主机“1”退出。我只是不知道该把这个放在哪里。我是否只需在脚本末尾添加如下内容:if$HttpStatusCode=200{Write Host“0”}else{Write Host“1”}?