Powershell の Copy-Item がサイレントに失敗する

Powershell の Copy-Item がサイレントに失敗する

Windows Server 2008 R2 64 ビットで実行されている PowerShell 2.0 スクリプトがあり、いくつかの Hyper-V .vhd ファイルを「バックアップ ソリューション」として別のサーバーにコピーします。

スクリプトはコピーする .vhd のリストを取得し、Copy-Item を使用してそのリストを反復処理してコピーします。また、ログ情報もファイルに書き込みます。ファイルは別のサーバー (Windows Server 2003 Sp2) の NTFS 圧縮されたディレクトリにコピーされます。

ファイルの 1 つはコピーされていません。これは比較的大きい (約 68 GB) です。他のファイルは 20 GB 以下です。奇妙なことに、コピー プロセス中にファイルが宛先サーバー上に表示され、生成されたログ ファイルには、ログ ファイル エントリの時間の違いにより、ファイルがコピーされたことが示されているようです。

ログ ファイルにはエラー メッセージが表示されず、どちらのマシンのイベント ログにも何も表示されません。

コピーを実行するコードは次のとおりです。

Get-ChildItem $VMSource *.vhd -Recurse | foreach-object {

    $time = Get-Date -format HH.mm.ss
    Add-Content $logFileName "$time : File Copy ($_) started" 

    $fullname = $_.FullName
    Add-Content $logFileName "$time : Copying $fullname to $VMDestination" 

    Copy-Item $fullname $VMDestination -Force -ErrorAction SilentlyContinue -ErrorVariable errors

    foreach($error in $errors)
    {
        if ($error.Exception -ne $null)
        {
            Add-Content $logFileName "'tERROR COPYING FILE : $($error.Exception)"
        }
    }

    $time = Get-Date -format HH.mm.ss
    Add-Content $logFileName "$time : File Copy ($_) finished"
}

おそらく、これほど大きなファイルを圧縮ディレクトリにコピーすると、何らかの問題が発生するとしか考えられません。何かアイデアはありますか?

答え1

問題は、そのファイルのコピー全般にありました。エクスプローラーでファイルのコピーを試みましたが、約 1 時間後、ファイルの一部が別のプロセスによってロックされているというエラーが表示されて失敗しました。

最終的には、ファイルを宛先に移動する前に zip 圧縮するようにスクリプトを修正しました。スクリプトは、時間は大幅に長くなりましたが、正常に実行されるようになりました。

何か回答があればよろしくお願いします。

答え2

-errorvariable オプションを調べる必要があります。-errors の代わりに +errors を使用すると、追加のエラーが取得される場合があります。

関連情報