我正在尝试在 PowerShell 中提出一种(简单且快速)的方法来确定 URL 表示的资源(例如文件)是否存在。 我读过关于此的不同帖子,但是: 当我使用
Invoke-WebRequest "https://downloads.sourceforge.net/blah" -DisableKeepAlive -UseBasicParsing -Method head
我回来了
StatusCode : 200
StatusDescription : OK
Content :
RawContent : HTTP/1.1 200 OK
当我使用 CURL 时,我得到 404:
curl "https://downloads.sourceforge.net/blah"
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
The resource could not be found.<br /><br />
</body>
</html>
当资源确实存在时,Invoke-WebRequest 再次返回 200,CURL 再次返回 302(找到)。
CURL 与 Invoke-WebRequest 有何不同?我尝试使用 GET、POST 调用 Invoke-WebRequest - 没有变化。
curl
(Windows 上为 curl.exe
)与 PowerShell 的 Web cmdlet、Invoke-WebRequest
和 Invoke-RestMethod
,使用不同的用户代理字符串,许多网站会根据该字符串修改其行为,这解释不同的行为:
不幸的是,PowerShell 的 Web cmdlet 使用的用户代理字符串类似于成熟的交互式浏览器;例如,在 Windows 上使用 7.5 版本的 PowerShell (Core) 7:
Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.22621; en-US) PowerShell/7.5.0
相比之下,
curl
使用类似:
curl/8.6.0
但是,PowerShell 的 Web cmdlet(如
curl.exe
,带有 -A
/ --user-agent
)允许您通过 -UserAgent
指定 自定义用户代理字符串。
因此,你可以让你的行为像
curl
那样:
Invoke-WebRequest -UserAgent curl/8.6.0 https://downloads.sourceforge.net/blah
注:
-UserAgent curl
至少手头的 URL 似乎就足够了,尽管我不知道这是否适用于所有网站。