Powershell Invoke-WebRequest メソッド Head が RAM を過剰に割り当てる

Powershell Invoke-WebRequest メソッド Head が RAM を過剰に割り当てる

Powershell v 4.0 のサーバーで問題が見つかりました (Powershell 5.1 を搭載したサーバーでは、同じ問題の影響を受けていないようです)

これは奇妙な行動だ呼び出しWebリクエスト指示。

次の例を見てみましょう。

何らかの理由で、サーバーにダウンロードする前にファイル サイズを知る必要があります。

次に、次のコマンドを使用します。

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

問題は送信前に$WebClientリクエストPowershellは(コミットRAM用に)約120MBを使用しますが、リクエスト後powershell は、ファイルの $filesize 値に応じて RAM を拡張します (例: リモート ファイルは 800 MB、新しいコミット RAM は 920 MB)。

Powershell WinRM セッションが 1GB の RAM に制限されている場合、これが問題になる可能性があります。(OOM)

答え1

Invoke-WebRequestメソッドを使用しHEADて、ヘッダーのみを取得し、何もダウンロードしないようにすることができます。要求するリソースの長さがわかっている場合は、Content-Length使用できるヘッダーが取得されます。

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

すべてのサーバーがContent-Lengthすべてのリクエストに対してヘッダーを返すわけではないことに注意してください。その場合は、ファイル全体を読み取る上記の方法を使用する必要がありますが、これは遅くなり、メモリを無駄に消費します。

インターネットリクエストを行うWindows DLLに直接インターフェイスすることもできます。 ウィネット (Windows Serverでは利用できません)、または Windows HTTP サービス

関連情報