复制与元数据列表匹配的文件(大小,时间戳,扩展名)

时间:2017-08-24 23:10:40

标签: php windows file powershell

我正在编写一个脚本,用于从A到B复制其元数据与list.txt文件匹配的文件。

list.txt文件包含要复制的每个文件的长度(大小),LastWriteTime和filename.ext。例如:

"5475891","2017-02-18 20:28:22","aaa.JPG"
"555109","2017-06-22 06:59:34","bbb.pdf"
"56363","2017-06-30 22:44:48","uuu.docx"
"638700","2017-07-31 18:41:43","uuu.docx"
"647053","2014-08-15 20:56:28","ppp.jpg"
"78725","2017-08-02 05:55:57","fff.php"
"79946","2017-08-02 06:42:03","kkk.pdf"
"8404037","2016-05-19 05:58:20","iii.pdf"
"85957","2017-07-31 22:44:23","777.pdf"

A上的每个文件,递归地,在长度 LastWriteTime .ext(扩展名)中100%匹配忽略.ext!之前的文件名字符)将被复制到B,保留A中存在的目录树结构。(A或B中没有覆盖或删除)。 / p>

我坚持使用脚本:

$Source=Get-Content list.txt
Get-childitem -recurse -file | select-object  length, lastwritetime, GetExtension
foreach($item in $Source){
    $file = gci -filter $("*{0}*" -f $item)
    if ($file -ne $null)
    {
        Copy-Item $file A: B:
    }
}

关于我做错了什么的建议? PowerShell或PHP。

1 个答案:

答案 0 :(得分:1)

  • 首先将列表作为csv文件阅读
  • 然后,我将使用列表元素中的一个唯一键构建一个哈希表
  • 然后迭代源,构建密钥并检查哈希表中是否存在
  • 如果找到构造目的地,则将A的根替换为B的根并复制

Get-Help command将提供每个命令的正确语法。

编辑已更改为使用完整日期时间作为密钥的一部分并使用小写扩展名 EDIT2 插入if以检查$ Destination文件夹是否存在,如果没有创建它。这确实在本地测试中有效。

## Q:\Test\2017\08\25\SO_45872202.ps1

$Source = "Q:\Test\2017\"
$Target = "C:\Test\2017\"

$List = Import-Csv list.txt -Header Size,LastWriteTime,Name

$Hash = @{}
ForEach ($Row in $List){
    $Key = ("{0},{1},.{2}" -F $Row.Size,$Row.LastWriteTime,$Row.Name.Split('.')[-1].ToLower())
    IF (!($Hash[$Key])) {$Hash.Add($Key,$Row.Name)}
}
$Hash | Format-Table -Auto

Get-Childitem -Path $Source -Recurse -File | ForEach-Object {
    $Key = ("{0},{1},{2}" -F $_.Length,($_.LastWriteTime).ToString('yyy-MM-dd HH:mm:ss'),$_.Extension.ToLower())
    #$Key
    If ($Hash[$Key]){
        $Destination = $_.FullName -Replace "^$([RegEx]::Escape($Source))","$Target"
        If (!(Test-Path (Split-Path $Destination))){MD (Split-Path $Destination)|Out-Null}
        $_ | Copy-Item -Destination $Destination #-WhatIf
    }
}

如果输出看起来正常,请从Copy-Item

中删除尾随的-WhatIF