Найдите папки, созданные после даты X, и скопируйте их

Мне нужно пройти через большую папку (назовем ее D:\Files), которая содержит около 50000 папок и около 1 миллиона файлов, и скопировать все папки, которые были созданы (не изменены) после 31 августа 2012 года, включая все в их подпапках (включая вложенные папки второго / третьего / четвертого уровня и т. д.) и файлы (также файлы в подпапках, независимо от того, когда они были изменены) в этих папках, для них независимо от того, когда они были созданы, если они находятся в "более высоком" папка up, созданная после августа, на другой диск (назовите его E:\Space), сохраняя при этом исходную структуру папок, поэтому файл, который был ранее в D:\Files\Folder1\Subfolder3\hello.txt, должен быть в E:\Space\Folder1\Subfolder3\hello.txt

Фоном является то, что некоторые папки были созданы в структуре после августа, но файлы в них имеют более старую дату изменения, и мне нужно включить в процесс поиска все, что было добавлено в D: \ Files после 31 августа 2012 года, поэтому я могу Не могу понять, какие файлы были недавно добавлены, а какие были там уже до августа, и мне нужно найти дату создания папки.

Таким образом, если папка D: \ Files \ Folder1 была создана в сентябре, то файлы и папки в ней - будь то один, два, три, четыре уровня и глубиной, независимо от того, когда она была изменена / изменена, должны быть перемещены в E: \ Пространство с PowerShell.

В последние два дня я пытался дозвониться, но до сих пор с треском провалился.

Я знаю, что, возможно, с Powershell это нелегко, поскольку для этого требуется несколько шагов, но любая помощь будет принята с благодарностью.

Спасибо.

2 ответа

Попробуйте что-то вроде этого:

$srcRoot = "D:\Files"
$dstRoot = "D:\Space"

$ct = Get-Date "2012-09-01"

Get-ChildItem -Recurse $srcRoot | ? {
  $_.PSIsContainer -and $_.CreationTime -ge $ct
} | sort FullName | % {
  $name = $_.FullName
  if ($top -eq $null) {
    $top = $name
  } elseif ( $name.substring(0, [math]::Min($top.Length, $name.Length)) -ne $top ) {
    $top = $name
    $dst = $_ -replace [regex]::Escape($srcRoot), $dstRoot
    Copy-Item $name $dst -Recurse -Force
  }
}

Вам следует подумать об использовании robocopy.exe для решения этой задачи.

Если вы ищете решение для PS, взгляните на представленные в скрипте 2013 игры 1

Другие вопросы по тегам