我目前正在扫描目录并匹配文件名,然后根据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
}
}
}
}
答案 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
}
}
}