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 サービス。