0

以下の機能は、ディレクトリ構造を平坦化し、最後に選択した書き込み日に基づいてファイルをコピーします。PowerShell Flatten Directory構造

function mega-copy($srcdir,$destdir,$startdate,$enddate) 
{ 
$files = Get-ChildItem $SrcDir -recurse | Where-Object { $_.LastWriteTime -ge "$startdate" -and $_.LastWriteTime -le "$enddate" -and $_.PSIsContainer -eq $false }; 
$files|foreach($_) { 
       cp $_.Fullname ($destdir+$_.name) -Verbose 
} 
} 

これは、小さいディレクトリの非常に成功しているが、複数のサブディレクトリとファイルとディレクトリのためにそれを使用しようとすると、数十万人から数千万人に至るまでカウントしたとき、それは単に失速。これを実行して24時間放置すると、1つのファイルがコピーされたり、PowerShellコンソールウィンドウに何も表示されたりしませんでした。この特定の例では、およそ2,700万のファイルがありました。

しかし、非常に遅いですが、単純なバッチファイルは何の問題もなくジョブを実行しました。

私はここで助けていただきありがとうございます。

+1

-and $_.PSIsContainer -eq $false 

を使用して、単純に-fileスイッチを使用して、そして答えは、この結果として私のスクリプトにはいくつかの簡単な変更だったとは対照的に、というカップルhttp://stackoverflow.com/a/39657987/3959875 – wOxxOm

+1

これは、robocopyがより適していて、wOxxOmのように、ファイルを変数に保存しないと言うことです。パイプラインを使用してください。少なくともPowerShell 3.0をお持ちの場合は、Get-Childitemの '-File'スイッチを使用することもできます。 – Matt

+0

ニース。どちらも私に関連性のある情報を提供し、この方法で大量のデータを移動するのにかかる時間を短縮するように見えました。どうもありがとうございます。 – GreatMagusKyros

答えて

0

単純な答えはこれです:中間変数を使用すると、ファイル移動の開始が非常に遅くなりました。中間変数を使用しないでください

function mega-copy($srcdir,$destdir,$startdate,$enddate) 
{ 
Get-ChildItem $SrcDir -recurse -File | Where-Object { $_.LastWriteTime -ge "$startdate" -and $_.LastWriteTime -le "$enddate" } | foreach($_) { 
       cp $_.Fullname ($destdir+$_.name) -Verbose 
} 
} 
関連する問題