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-WebRequest
die HEAD
Methode verwenden, um nur die Header abzurufen und nichts herunterzuladen. Wenn die angeforderte Ressource eine bekannte Länge hat, erhalten Sie einen Content-Length
Header, 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.