Попытка скопировать файлы с определенной датой из папок в другое место с зеркальной структурой папок

У нас что-то вроде временного краха файла. Есть куча файлов от 09.04.2019, которые нам нужны из кучи каталогов. В каждом каталоге ~ 1000 файлов. Мы хотим скопировать все эти файлы от 09.04.2019 в соответствующие структуры папок, но только эти файлы.

Мы использовали xcopy для копирования структуры папок и вручную копировали нужные нам файлы. Тем не менее, есть 1000 папок, каждая из которых содержит ~ 1000 файлов, так что это довольно сложно. Пытался передать наши аргументы в copy-item, но мне это не очень везло.

Я предполагаю, что даже с моим искаженным кодом есть какой-то простой параметр или что-то, что я упустил. Мы работали во время перерыва, я просмотрел множество тем и обращаюсь за помощью к сообществу. Я, вероятно, передал свою точную проблему по пути сюда.

Для справки, я не пишу код и редко использую PowerShell.

#Gets all files that were last modified on 4/9/2019
(Get-ChildItem -Recurse | Where-Object {$_.LastWriteTime -gt (Get-Date -month 4 -day 9 -Format d) -and $_.LastWriteTime -lt (Get-Date -month 4 -day 10 -Format d)}) |

#Copies the files from source to destination
Copy-Item "C:\abc\" "D:\abc\"

}

person Sokka Foo    schedule 25.04.2019    source источник
comment
Первое, что вы можете использовать, это -WhatIf включить Copy-Item. Это скажет вам, что произойдет, если это будет сделано.   -  person lit    schedule 25.04.2019
comment
robocopy имеет более старые/новые опции для операций копирования/перемещения файлов. когда у вас больше нескольких файлов, powershell НЕ является правильным инструментом, а robocopy.   -  person Lee_Dailey    schedule 25.04.2019
comment
Lee_Dailey прав. Существуют различные случаи, когда старые утилиты, такие как Robocopy, просто лучше справляются со своей задачей и их проще использовать для таких задач.   -  person cet51    schedule 25.04.2019
comment
Есть ли способ получить определенный день из robocopy? Пробовал с этим и xcopy, но всегда захватывал больше файлов, чем предполагалось, или вообще не захватывал файлы. Я пробовал maxage, minage, xo и xn безуспешно. Любые советы по робототехнике?   -  person Sokka Foo    schedule 25.04.2019


Ответы (1)


При работе с переменными типа [datetime] не применяйте -format D, это преобразует в строку,
вместо этого удаляйте компонент времени, добавляя .Date к обеим сторонам и проверяя на равенство.

Поскольку вы рекурсируете исходный код во вложенные папки, вы не можете указать плоскую цель

$Source = "C:\abc\" 
$Target = "D:\abc\"
$MyDate = (Get-Date -Month 4 -Day 9 -Year 2019).Date

Get-ChildItem -Path $Src -Recurse | 
    Where-Object {$_.LastWriteTime.Date -eq $MyDate} | ForEach-Object{
        $TargetDir = $_.DirectoryName.replace($Source,$Target)
        If (!(Test-Path $TargetDir)){New-Item $TargetDir -ItemType Directory|Out-Null}
        $_ | Copy-Item -Destination $TargetDir
    }

Непроверенный, вы можете добавить параметр -WhatIf к Copy-Item во время тестирования.

Robocopy, безусловно, работает быстрее, если вы нашли правильные параметры.

person Community    schedule 25.04.2019