4

私のpowershellスクリプトは、次のコードを使用して、カスタマイズされたセッション内で複数のクライアントにファイルを送信します(コードは短縮されています)

function DoCopyFile
{
    param(
    [Parameter(Mandatory=$true)] $RemoteHost,
    [Parameter(Mandatory=$true)] $SrcPath,
    [Parameter(Mandatory=$true)] $DstPath,
    [Parameter(Mandatory=$true)] $Session)
.
.
.               
    $Chunks | Invoke-Command -Session $Session -ScriptBlock { `
        param($Dest, $Length)

        $DestBytes = new-object byte[] $Length
        $Pos = 0
        foreach ($Chunk in $input) {
            [GC]::Collect()
            [Array]::Copy($Chunk, 0, $DestBytes, $Pos, $Chunk.Length)
            $Pos += $Chunk.Length
        }

        [IO.File]::WriteAllBytes($Dest, $DestBytes)
        [GC]::Collect()
    } -ArgumentList $DstPath, $SrcBytes.Length
.
.
.
}


$Pwd = ConvertTo-SecureString $Node.Auth.Password -asplaintext -force
$Cred = new-object -typename System.Management.Automation.PSCredential -ArgumentList ("{0}\{1}" -f $Name, $Node.Auth.Username),$Pwd
$Sopts = New-PSSessionOption -MaximumReceivedDataSizePerCommand 99000000
$Session = New-PSSession -ComputerName $Name -Credential $Cred -SessionOption $Sopts
DoCopyFile $Name ("{0}\{1}" -f $Node.Installer.ResourceDir, $Driver.Name) $Dest $Session

フル コピー機能については、http: //poshcode.org/2216で説明しています。

この問題は、52MB を超えるファイルで発生します。次のエラーで失敗します。

Sending data to a remote command failed with the following error message: The total data received from the remote
client exceeded allowed maximum. Allowed maximum is 52428800. For more information, see the
about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OperationStopped: (CLI-002:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : JobFailure
    + PSComputerName        : CLI-002

コードでわかるように、カスタマイズされた ps セッションを使用します。MaximumReceivedDataSizePerCommand を非常に低い値 (10kb など) に設定すると、最大値が 10kb であることを示すメッセージが表示されて失敗するため、MaximumReceivedDataSizePerCommand が ps セッション オブジェクトに適用されると想定します。

リモート マシンまたは他の場所でこの構成を行う必要がありますか? このエラーの原因は何ですか?

ありがとう。

4

2 に答える 2

14

PSSessionConfigurationリモートコンピューターに新しいものを作成する必要があります(これはデフォルトのものを使用しないためです):

Register-PSSessionConfiguration -Name DataNoLimits #or the name you like.

次に、必要なパラメーターを構成します (この場合はMaximumReceivedDataSizePerCommandMBMaximumReceivedObjectSizeMB):

Set-PSSessionConfiguration -Name DataNoLimits `
-MaximumReceivedDataSizePerCommandMB 500 -MaximumReceivedObjectSizeMB 500

PSSessionConfiguration次に、必要な新しいセッションを作成します。

$Session = New-PSSession -ComputerName MyRemoteComp -ConfigurationName DataNoLimits

あなたのローカルコンピュータで。

このようにして、posh.org の Send-File を使用して、約 80MB のサイズのファイルをコピーします。サイズが大きくなると、メモリ不足の例外が返されます。

詳細はこちら。

于 2012-11-26T10:25:39.217 に答える
0

バックグラウンド インテリジェント転送サービス (BITS) に関するこの投稿を見ることができます。詳細については、MSDN ドキュメントも参照してください。記事から、次の考慮事項があります。

BITS プロトコルを使用する利点:

  • BITS は、他のネットワーク アプリの動作に影響を与えないように、使用帯域幅を制御できるインテリジェントなプロトコルです。BITS は空き帯域のみを使用し、転送中にデータ レートを動的に変更できます (他のアプリケーションがネットワークの使用を増加させた場合)。
  • 中断またはコンピューターの再起動が発生した場合、BITS タスクは自動的に再開されます。
  • ファイルは、ユーザーに気づかれずにバックグラウンドでダウンロードできます
  • 受信者側とサーバー側は、展開された IIS サーバーを必要としません。

したがって、BITS は、低速ネットワークで大きなファイルを転送する場合に適したプロトコルです。

それが役立つことを願っています。

于 2018-07-25T13:25:59.973 に答える