从CSV将文件复制到多个位置

时间:2017-03-06 20:44:33

标签: powershell powershell-v2.0

我目前正在扫描目录并匹配文件名,然后根据csv文件将它们复制到各种文件共享位置。 CSV文件应包含2个字段:目标列=复制路径,字符串查找列=标识要复制的文件。

我的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
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

一方面没有专栏"发现"在你的CSV中。我将假设你标题的列"匹配文件名"实际上有标题"找到"。

您的问题是由代码中的嵌套双循环引起的。迭代每个模式,然后将匹配给定模式的所有文件复制到CSV中最内层循环的每个目标。

对CSV数据只使用一个循环(以保持过滤器字符串和目标路径之间的关联不变),问题将消失。我还建议使用Contains()方法而不是-like运算符,因此您不需要在过滤字符串中添加通配符。

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