我想从下面的源目录复制到所需的目的地,如下所示。
源目录:
--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
}