使用Powershell/curl检查HTTP头时出现问题

3

这比我想象的要困难得多(也许比应该的还要困难)。

我尝试了Cygwin+curl,但它无法运行(Cygwin找不到curl.exe,但我进行了软件包检查,它确实在那里)。

我尝试了使用命令提示符的Windows curl,它可以工作。但是我有很多url需要检查,逐个检查效率太低。我无法通过cmd提示告诉curl使用文件(因为没有“xargs”),如此处所述。

我还尝试使用PowerShell,但也存在问题。当我尝试遵循这里的选项1时,运行$xHTTP.open("GET",$url,$false)时出现错误:

Exception calling "open" with "3" argument(s): "Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))"

另外,对于PowerShell,我完全不知道如何让它使用包含url的文件。我对PS的了解非常非常有限(几乎为零)。

这里需要解决的问题是找出如何让命令提示符/curl使用文件,但我无法解决这个问题。

1个回答

8

使用PowerShell V3有一种更直接的方法:

PS> Get-Content .\urls.txt
http://www.cnn.com
http://www.msn.com

PS> Get-Content urls.txt | Foreach { Invoke-WebRequest -Uri $_ -Method HEAD }

StatusCode        : 200
StatusDescription : OK
Content           :
RawContent        : HTTP/1.1 200 OK
                    Vary: Accept-Encoding
                    Connection: Keep-Alive
                    Cache-Control: max-age=60, private
                    Content-Type: text/html
                    Date: Tue, 08 Jan 2013 20:21:46 GMT
                    Expires: Tue, 08 Jan 2013 20:22:46 GMT...
Forms             : {}
Headers           : {[Vary, Accept-Encoding], [Connection, Keep-Alive], [Cache-Control, max-age=60, private],
                    [Content-Type, text/html]...}
...

要处理404错误,可以使用try/catch语句,例如:

PS> Get-Content urls.txt | 
        Foreach {try {Invoke-WebRequest -Uri $_ -Method HEAD} catch { "Oops - $_"}}

要重定向到文件,以下方式适用于我:
PS> Get-Content urls.txt | 
        Foreach {try {Invoke-WebRequest -Uri $_ -Method HEAD} catch { "Oops - $_"}} > 
        $home\Desktop\foo.txt

关于这个问题我有几个疑问(但大部分都是我需要的)。有没有一种优雅的方式来处理404错误?现在,404错误会导致异常。我正在尝试将其输出到文件中,使用-OutFile .\Desktop\results.txt。它创建了文件,但是文件是空的。显然我漏掉了什么,但不确定是什么。 - Kurt
1
请使用值为0的-MaximumRedirection参数。 - Keith Hill
1
这也是Invoke-WebRequest的一个参数。当然,这并不意味着它像广告中所说的那样有效。你试过iwr -url $_ -Method Head -MaximumRedirection 0吗? - Keith Hill
我试着添加了那个,但是什么也没有发生(它运行并且文件被创建了,但是里面没有东西,在控制台中也没有错误)。所以我尝试修改了一下;如果我去掉了 iwr(顺便说一下,我不知道它是干什么的),将 -url 改回 -Uri,大部分情况下都能正常工作。我得到了一个文件中的第一个响应代码,就像我想要的那样。在控制台中有一个关于超过最大重定向次数的消息,但我可以接受它,因为它不会停止代码。我还有更多问题,但我会尝试解决它们。如果我卡住了,我会创建一个新的问题。感谢您的帮助! - Kurt
@Braffin iwr 只是 Invoke-WebRequest 的别名。对于 -Url\Uri 混淆感到抱歉,应该使用 -Uri。顺便说一句,这在我这里可以工作。我刚刚在一个我很久以前设置的 redirect.aspx 页面上测试了它。将 MaximumRedirection 设置为 0,会返回一个 302 响应和第一个跳转的标头,而不是后续的重定向。虽然我会得到一个错误,但我用参数 -ErrorAction SilentlyContinue 将其抑制了。 - Keith Hill
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接