在装有 Powershell v 4.0 的服务器上发现问题 (使用 Powershell 5.1 的服务器似乎没有受到相同问题的影响)
这是一个奇怪的行为调用 Web 请求命令。
请看这个例子:
出于某种原因,我需要在将文件下载到我的服务器之前知道文件的大小。
然后我使用以下命令:
$WebClient = Invoke-WebRequest -Uri $element -Method Head -Credential $Cred
$filesize = $webClient.Headers.'Content-Length'
问题是发送前$WebClient 请求 Powershell 使用(用于提交 RAM)大约 120MB,但是请求后powershell 将您的 RAM 扩大到文件 $filesize 值(例如远程文件为 800MB,新的 Commit RAM 为 920MB)。
当您使用 Powershell WinRM 会话限制为 1GB RAM 时,这可能会成为一个问题。(OOM)
答案1
您可以使用Invoke-WebRequest
该HEAD
方法仅获取标头而不下载任何内容。如果您请求的资源具有已知长度,那么您将获得一个Content-Length
可以使用的标头:
(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'
请注意,并非所有服务器都会返回Content-Length
所有请求的标头。在这种情况下,您将需要使用上述方法读取整个文件,尽管它速度较慢且浪费内存。
您还可以直接与执行 Internet 请求的 Windows DLL 交互, 温因特网 (在 Windows Server 上不可用),或者使用 Windows HTTP 服务。