根据文件的最后修改日期进行复制

根据文件的最后修改日期进行复制

我想从下面的源目录复制到所需的目的地,如下所示。

源目录:

--Dummy
----dirA (contain files last modified 2/7/2015)
----dirB (contain files last modified 3/7/2015)
----dirC (contain files last modified 18/7/2015)
----dirD (contain files last modified 18/7/2015)
----dirE (contain files last modified 2/7/2015)

Dummy 中的每个文件都dir包含具有特定最后修改日期的文件

目标目录应该如下所示:

--Dummy2015-07-2
----dirA (contain files last modified 2/7/2015)
----dirE (contain files last modified 2/7/2015)

--Dummy2015-07-3
----dirB (contain files last modified 3/7/2015)

--Dummy2015-07-18
----dirC (contain files last modified 18/7/2015)
----dirD (contain files last modified 18/7/2015)

到目前为止,通过参考这里,我设法得出了这样的结论:

$sourcePath = 'c:/dummy'
$destPath = 'e:/dummy'  

Get-ChildItem -recurse -Path $sourcePath | Group {$_.LastWriteTime.ToString("yyyy-MM-dd")} | 
 Foreach-Object{
     $folder = New-Item -Path "$($destPath)$($_.Name)" -ItemType Directory -Force
     $_.Group | Where-Object { -not (Test-Path "$($folder.FullName)\$($_.Name)") } | Copy-Item -Destination $folder.FullName 
}

但是上面的代码直接复制了源虚拟目录下的文件,使得目标变成这样:

--Dummy2015-07-2
----(all files from dirA & dir E)

--Dummy2015-07-3
----(all files from dirB)

--Dummy2015-07-18
----(all files from dirC & dirD)

(如果可能的话,想使用 robocopy 来做到这一点)

答案1

dirA 是否仅包含 2015.07.02 修改的文件?还是包含在此之前修改的文件?在我的回答中,我假设是前者。我还假设每个文件夹仅包含文件,或者包含您想要与同一文件夹关联的文件夹(即您不会将它们移出其父文件夹)。

以下是应该可以运行的代码。填写前 2 个变量。
嘿,它使用了robocopy! :)

$PathToRootOfDummy = "C:\path\to\dummy\root"
$PathToReplacementPrefix = "C:\path\to\dummy_new-" # date goes after the '-'

Get-ChildItem $PathToRootOfDummy | Where-Object {$_.PSISContainer -eq $true} | ForEach-Object {
    $nf = "$PathToReplacementPrefix$($(Get-ChildItem -Path $PathToRootOfDummy\$($_.Name) | Where { ! $_.PSIsContainer} )[0].LastWriteTime.tostring("yyyy-MM-dd"))"
    mkdir $nf
    robocopy -s -e $PathToRootOfDummy\$_ $nf
}

相关内容