2017-03-06 5 views
0

現在、ディレクトリと、一致するファイル名のをスキャンしており、csvファイルに基づいてさまざまなファイル共有場所にファイルをコピーしています。 CSVファイルには2つのフィールドが必要です:コピー先の列=コピーのパスと、Find column =コピーするファイルを識別する文字列です。CSVから複数の場所にファイルをコピーする

私のCSVファイルは次のようである:現在

"matching file names"  , "Destination" 
"Don" ,  "c:\test\a" 
"Quest"  , "c:\test\b"

すべての場所にコピーしたすべてのファイルを。

スクリプト:

$csv = Import-Csv -Path "C:\Temp\list.csv" 
$filepath = 'C:\Temp\Source' 

Get-ChildItem $filepath | foreach { 
    $criteria = $csv 
    $find = $csv | select -ExpandProperty find 

    $a = $_.FullName 
    foreach ($f in $find) { 
    if ($a -like "*$f*") { 
     foreach ($c in $criteria) { 
     Copy-Item $_.FullName $c.Destination 
     } 
    } 
    } 
} 

答えて

0

一つにはあなたのCSVで "見つける" 何の列はありません。私はあなたが "一致するファイル名"というタイトルの列に実際に "find"というタイトルが付いていると仮定します。

問題は、コードのネストされたダブルループによって発生します。それぞれのパターンを繰り返し、指定されたパターンに一致するすべてのファイルを最内ループのCSVからすべての宛先にコピーします。

CSVデータにループを1つだけ使用すると(フィルタ文字列と宛先パスの関連付けが損なわれないようにする)、問題は消えます。また、-like演算子の代わりにContains()メソッドを使用することをお勧めします。そのため、フィルタ文字列にワイルドカードを追加する必要はありません。

Get-ChildItem $filepath | ForEach-Object { 
    foreach ($filter in $csv) { 
    if ($f.Name.Contains($filter.find)) { 
     Copy-Item $_.FullName $filter.Destination 
    } 
    } 
} 
+0

ありがとうございました。 – kbs

関連する問題