将文件复制到从CSV
问题描述:
多个位置我目前扫描目录和匹配的文件名,然后将它们复制到基于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
}
}
}
}
答
一方面我们在您的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
}
}
}
谢谢你,这个工作。 – kbs