2016-09-06 75 views
0

我有以下的CSV列表(在線路的現實1000):如何最有效地移動,重命名文件並記錄此操作?

needle,code 
123456,AB 
121212,BB 
33333333,CVV

而且我有一個目錄(C:\old_files)含有PDF文件(同樣,在現實中1000):

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. 寫的條目進入日誌。

對於這個例子,我有123456和2 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循環中的所有文件對於每個needle都需要太長時間。因此,與感謝這個論壇,我首先建立一個哈希表:

$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 } 

我在這裏的第一個問題:我無法將文件移動到新文件夾。

Q1如何正確地將文件從C:\old_files複製到D:\new_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 
}