2017-03-06 137 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