Powershell Invoke-WebRequest mit Method Head weist zu viel RAM zu

Powershell Invoke-WebRequest mit Method Head weist zu viel RAM zu

Auf dem Server mit Powershell v 4.0 wurde ein Problem gefunden (Server mit Powershell 5.1 scheinen nicht vom gleichen Problem betroffen zu sein)

Dies ist ein seltsames Verhalten vonInvoke-WebRequestBefehl.

Nehmen Sie dieses Beispiel:

Aus irgendeinem Grund muss ich die Dateigröße kennen, bevor ich sie auf meinen Server herunterlade.

Dann verwende ich die folgenden Befehle:

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

Das Problem istvor dem Senden$WebClient request Powershell verwendet (für Commit RAM) etwa 120MB, abernach der AnfragePowershell vergrößert Ihren RAM um den Dateiwert $filesize (Beispiel: Remote-Datei ist 800 MB groß, neuer Commit-RAM ist 920 MB groß).

Wenn Sie mit einer Powershell WinRM-Sitzung arbeiten, die auf 1 GB RAM begrenzt ist, kann dies ein Problem sein. (OOM)

Antwort1

Sie können Invoke-WebRequestdie HEADMethode verwenden, um nur die Header abzurufen und nichts herunterzuladen. Wenn die angeforderte Ressource eine bekannte Länge hat, erhalten Sie einen Content-LengthHeader, den Sie verwenden können:

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

Beachten Sie nur, dass nicht alle Server den Header für alle Anfragen zurückgeben Content-Length. In diesem Fall müssen Sie die obige Methode verwenden, die die gesamte Datei liest, obwohl sie langsamer ist und Speicher verschwendet.

Sie können auch direkt auf die Windows-DLLs zugreifen, die Internetanforderungen ausführen, entweder WinINet (nicht verfügbar unter Windows Server) oder mithilfe von Windows HTTP-Dienste.

verwandte Informationen