我有以下CSV列表(实际上是1000行):
needle,code 123456,AB 121212,BB 33333333,CVV
我有一个包含PDF文件的目录(C:\old_files
)(实际上是1000s):
dsadsadsa.343222.dsads23213jkjl.saddsa.pdf dsadsadsa.123456.dsads23213jkjl.saddsa.pdf dsadsadsa.111111.dsads23213jkjl.saddsa.pdf dsadsadsa.33333333.dsads23213jkjl.saddsa.pdf dsadsadsa.33333333.fsdgdsfdsfdsf.dsad.pdf
对于CSV中的每个针:
D:\new_files
)例如,123456
与33333333
匹配,因此我必须将这些文件的副本移至D:\new_files
并将其重命名为:
AB.dsadsadsa.123456.dsads23213jkjl.saddsa.pdf CVV.dsadsadsa.33333333.dsads23213jkjl.saddsa.pdf CVV.dsadsadsa.33333333.fsdgdsfdsfdsf.dsad.pdf
日志文件看起来像(格式needle,code,oldfilepath,newfilepath
):
123456,AB,C:\old_files\dsadsadsa.123456.dsads23213jkjl.saddsa.pdf,D:\new_files\AB.dsadsadsa.123456.dsads23213jkjl.saddsa.pdf 33333333,CVV,C:\old_files\dsadsadsa.33333333.dsads23213jkjl.saddsa.pdf,D:\new_files\CVV.dsadsadsa.33333333.dsads23213jkjl.saddsa.pdf 33333333,CVV,C:\old_files\dsadsadsa.33333333.fsdgdsfdsfdsf.dsad.pdf,D:\new_files\CVV.dsadsadsa.33333333.fsdgdsfdsfdsf.dsad.pdf
重要的是,我只遍历目录中的文件一次,因为在每个ForEach
的{{1}}循环中遍历所有文件需要太长时间。所以感谢这个论坛,我首先要建立一个哈希表:
needle
我的第一个问题是:我无法将文件移动到新文件夹中。
Q1 如何将文件从$pairs = @{}
Import-CSV .\data.csv | ForEach-Object { $pairs[$_.needle] = $_.code+"." }
Get-ChildItem "C:\old_files" | Rename-Item -NewName { "D:\new_files\" + $pairs[$_.Name.Split('.')[1]] + $_.Name }
正确复制到C:\old_files
并重命名?
我的第二个问题:我不明白如何在上面的代码中添加代码。
Q2 如何为每个匹配创建日志文件(因此:复制并重命名文件)?
答案 0 :(得分:0)
在复制匹配文件之前,您需要实际检查是否匹配。
Get-ChildItem "C:\old_files" | ForEach-Object {
$n = ($_.Name -split '.')[1]
if ($pair[$n]) {
$oldname = $_.FullName
$newname = Join-Path 'C:\new_files' ($pair[$n] + $_.Name)
Copy-Item $oldname $newname
}
}
复制操作后执行日志记录:
Copy-Item $oldname $newname
if ($?) {
# log success information here
} else {
# log error information here
}