Обнаружена проблема на сервере с 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 ответ1

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .