Powershell Invoke-WebRequest с методом Head выделяет слишком много оперативной памяти

Обнаружена проблема на сервере с Powershell v 4.0(сервер с Powershell 5.1, похоже, не подвержен той же проблеме)

Это странное поведение команды Invoke-WebRequest.

Возьмите этот пример:

По какой-то причине мне нужно знать размер файла перед его загрузкой на мой сервер.

Затем я использую следующие команды:

$WebClient = Invoke-WebRequest -Uri $element -Method Head -Credential $Cred
$filesize = $webClient.Headers.'Content-Length'

Проблема заключается в том, что перед отправкой запроса $WebClient Powershell (для Commit RAM) примерно на 120 МБ, но после запроса PowerShell увеличит объем вашей оперативной памяти до значения $filesize файла (пример удаленного файла - 800 МБ, новой оперативной памяти - 920 МБ).

При работе с сеансом Powershell WinRM, ограниченным 1 ГБ ОЗУ, это может быть проблемой. (ООМ)

1 ответ

Ты можешь использовать Invoke-WebRequest с HEAD способ получить только заголовки и ничего не скачивать. Если запрашиваемый ресурс имеет известную длину, вы получите Content-Length заголовок, который вы можете использовать:

(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'

Просто отметьте, что не все серверы возвращают Content-Length заголовок для всех запросов. В этом случае вам нужно будет использовать вышеописанный метод, который читает весь файл, хотя он медленнее и тратит память.

Вы также можете напрямую взаимодействовать с DLL-библиотеками Windows, которые выполняют интернет-запросы, либо WinINet(недоступно на Windows Server), либо с помощью Windows HTTP Services.

Другие вопросы по тегам