2016-04-08 19 views
1

私はこのスクリプトを使って、私がCSVにリストアップした特定のファイルをリモートサーバから検索しています。しかし、プロセスは非常に遅いですし、それが私のコードであるかどうかは疑問です。どういうわけか改善することはできますか?私は単にディレクトリリストを作成し、私のCSV内のファイルを検索するだけで、すべてのファイルを再帰的に調べることを避ける方が早いかもしれないと思っています。この検索とコピースニペットの速度を上げることは可能ですか?

$source = "\\server1\Scanning_Maps" 
$destination = "\\server1\Transfer\TEST" 

$searchFiles = Import-CSV 'C:\Users\user1\Desktop\test.csv' -Header ("filename") 

ForEach($File in $searchFiles) 
{ 
    Get-ChildItem -Path $source -Recurse | Where-Object { $_.Name -match $File.filename } | Copy-Item -Destination $destination  
} 

答えて

2

しかしjisaakの調査結果のトップにこれをさらに減らすには、コピーしたいファイルをすべてのファイルに戻し、その後に処理を行うだけです。

単純にディレクトリリストを作成し、CSV内のファイルを検索するだけで、すべてのファイルを再帰的に調べることが避けられます。

-Includeを使用すると、ファイル名の配列を渡すことができ、必要なファイルのみを検索して返す必要があります。

また、ヘッダーを追加する場合は、1列のcsvしかないと推測します。そのような場合は、そのコマンドレットを気にせずにGet-Contentのみを使用する必要もありません。

$searchFiles = Get-Content 'C:\Users\user1\Desktop\test.csv' 

これがCSVファイルで、ヘッダーを使用して最初の列を処理するだけの場合は、その問題のビットを無視します。それがcsvの場合は、少なくとも列を展開して、オブジェクトの代わりに文字列配列を持つようにする必要があります。

$searchFiles = Import-CSV 'C:\Users\user1\Desktop\test.csv' -Header ("filename") | Select-Object -ExpandProperty filename 

-Includeを試してみましょう。それは-Recurseでのみ動作し、それがなければ何もできないことに注意してください。

Get-ChildItem -Path $source -Include $searchFiles -Recurse | Copy-Item -Destination $destination 

foreachループは必要ありません。それはさらに速くなければならない。

+0

それは働いています - 私にそれを歩いてくれてありがとう! – val

1

あなたはforeachループの外にそれを置く必要があります$searchFiles内のすべてのファイルについては、Get-ChildItemコマンドレットを実行します。あなたはできますが、いくつかのテストを行う必要があります

$source = "\\server1\Scanning_Maps" 
$destination = "\\server1\Transfer\TEST" 

$searchFiles = Import-CSV 'C:\Users\user1\Desktop\test.csv' -Header ("filename") 

$sourceList = Get-ChildItem -Path $source -Recurse 

ForEach($File in $searchFiles) 
{ 
    $sourceList | Where-Object { $_.Name -match $File.filename } | Copy-Item -Destination $destination  
} 
+0

$ fileのファイルパスがローカルファイルと一致する場合は、Get-Item $ File –

+0

を使用することができます。基本的な違いを私に説明できますか? Powershellについて熟知しておらず、ループ外でGet-ChildItemコマンドレットを動かすことで違いはないと仮定しました。 – val

+1

Get-ChildItemは、 '\\ server1 \ Scanning_Maps'にあるファイルを再帰的に収集します。これは、おそらく共有ドライブからのものです。 foreachループの外側に置くと、ファイルは一度だけ収集され、 '$ searchFiles'に格納されます。 –

関連する問題