На сервере обнаружена проблема с 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 ГБ ОЗУ. (OOM)
решение1
Вы можете использовать метод Invoke-WebRequest
with HEAD
, чтобы получить только заголовки и ничего не загружать. Если ресурс, который вы запрашиваете, имеет известную длину, то вы получите заголовок, Content-Length
который вы можете использовать:
(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'
Просто обратите внимание, что не все серверы возвращают Content-Length
заголовок для всех запросов. В этом случае вам нужно будет использовать ваш метод выше, который читает весь файл, хотя это медленнее и тратит память.
Вы также можете напрямую взаимодействовать с библиотеками DLL Windows, которые выполняют интернет-запросы, WinINet (недоступно на Windows Server) или с помощью HTTP-службы Windows.