如何最有效地移动,重命名文件并记录此操作?

时间:2016-09-06 07:35:29

标签: powershell

我有以下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中的每个针:

  • 我必须查看是否有包含该针的PDF(可能有0个或更多匹配)
  • 如果有比赛,我必须
    1. 将该文件的副本复制到一个单独的文件夹(D:\new_files
    2. 通过将相应代码添加到名称
    3. 来重命名复制的文件
    4. 在日志中写入一个条目。

例如,12345633333333匹配,因此我必须将这些文件的副本移至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 如何为每个匹配创建日志文件(因此:复制并重命名文件)?

1 个答案:

答案 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
}