2017-03-06 135 views
0

多個位置我目前掃描目錄和匹配的文件名,然後將它們複製到基於CSV文件中的各種文件共享的位置。 CSV文件應該有2個字段:目標列=用於複製路徑,字符串查找列=以確定要複製的文件。將文件複製到從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數據只使用一個循環(以保持過濾器字符串和目標路徑之間的關聯完好),問題就會消失。我也建議使用Contains()方法,而不是-like操作的,所以你不需要通配符添加到過濾字符串。

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

謝謝你,這個工作。 – kbs